C語言 動態記憶體會被自動釋放嗎?杜絕「野指標」

2022-08-30 16:27:18 字數 1032 閱讀 3142

函式體內的區域性變數在函式結束時自動消亡。很多人誤以為示例是正確的。理

由是p 是區域性的指標變數,它消亡的時候會讓它所指的動態記憶體一起完蛋。這是錯覺!

void func(void)

示例 試圖讓動態記憶體自動釋放

我們發現指標有一些「似是而非」的特徵:

(1)指標消亡了,並不表示它所指的記憶體會被自動釋放。

(2)記憶體被釋放了,並不表示指標會消亡或者成了null 指標。

這表明釋放記憶體並不是一件可以草率對待的事。也許有人不服氣,一定要找出可以

草率行事的理由:

如果程式終止了執行,一切指標都會消亡,動態記憶體會被作業系統**。既然如此,

在程式臨終前,就可以不必釋放記憶體、不必將指標設定為null 了。終於可以偷懶而不

會發生錯誤了吧?

想得美。如果別人把那段程式取出來用到其它地方怎麼辦?

「野指標」不是null 指標,是指向「垃圾」記憶體的指標。人們一般不會錯用null

指標,因為用if 語句很容易判斷。但是「野指標」是很危險的,if 語句對它不起作用。

「野指標」的成因主要有兩種:

(1)指標變數沒有被初始化。任何指標變數剛被建立時不會自動成為null 指標,它

的預設值是隨機的,它會亂指一氣。所以,指標變數在建立的同時應當被初始化,要麼

將指標設定為null,要麼讓它指向合法的記憶體。例如

char *p = null;

char *str = (char *) malloc(100);

(2)指標p 被free 或者delete 之後,沒有置為null,讓人誤以為p 是個合法的指標。

(3)指標操作超越了變數的作用範圍。這種情況讓人防不勝防,示例程式如下:

class a

};void test(void)

p->func(); // p 是「野指標」

}函式test 在執行語句p->func()時,物件a 已經消失,而p 是指向a 的,所以p 就

成了「野指標」。但奇怪的是我執行這個程式時居然沒有出錯,這可能與編譯器有關。

動態記憶體會被自動釋放嗎?

函式體內的區域性變數在函式結束時自動消亡。很多人誤以為示例 7 6是正確的。理由是 p是區域性的指標變數,它消亡的時候會讓它所指的動態記憶體一起完蛋。這是錯 覺!void func void 我們發現指標有一些 似是而非 的特徵 1 指標消亡了,並不表示它所指的記憶體會被自動釋放。2 記憶體被釋放了...

C語言之動態記憶體分配與釋放

1,堆記憶體特點 堆記憶體可以存放任意型別的資料,但需要自己申請與釋放。2,堆大小 堆大小,想像中的無窮大,但實際使用中,受限於實際記憶體的大小和記憶體是否有連續性。1,malloc函式 2,calloc函式 3,realloc函式 4,free函式 示例 include include int m...

C語言 動態記憶體

動態記憶體 動態的建立記憶體,申請記憶體空間為變數 存放於堆區,不能通過變數名或陣列名引用,只能通過指標引用,在windows中,堆中最大的連續記憶體塊為1.3g左右。標頭檔案 includemalloc 在空閒記憶體中分配連續記憶體,約等於2g,分配成功時返回乙個指向該記憶體塊的指標即第乙個位元組...