C語言:動態記憶體會被自動釋放嗎?杜絕“野指標”
函式體內的區域性變數在函式結束時自動消亡。很多人誤以為示例是正確的。理
由是p 是區域性的指標變數,它消亡的時候會讓它所指的動態記憶體一起完蛋。這是錯覺!
void Func(void)
{
char *p = (char *) malloc(100); // 動態記憶體會自動釋放嗎?
}
示例 試圖讓動態記憶體自動釋放
我們發現指標有一些“似是而非”的特徵:
(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
{
public:
void Func(void){ cout << “Func of class A” << endl; }
};
void Test(void)
{
A *p;
{
A a;
p = &a; // 注意 a 的生命期
}
p->Func(); // p 是“野指標”
}
函式Test 在執行語句p->Func()時,物件a 已經消失,而p 是指向a 的,所以p 就
成了“野指標”。但奇怪的是我執行這個程式時居然沒有出錯,這可能與編譯器有關。
由是p 是區域性的指標變數,它消亡的時候會讓它所指的動態記憶體一起完蛋。這是錯覺!
void Func(void)
{
char *p = (char *) malloc(100); // 動態記憶體會自動釋放嗎?
}
示例 試圖讓動態記憶體自動釋放
我們發現指標有一些“似是而非”的特徵:
(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
{
public:
void Func(void){ cout << “Func of class A” << endl; }
};
void Test(void)
{
A *p;
{
A a;
p = &a; // 注意 a 的生命期
}
p->Func(); // p 是“野指標”
}
函式Test 在執行語句p->Func()時,物件a 已經消失,而p 是指向a 的,所以p 就
成了“野指標”。但奇怪的是我執行這個程式時居然沒有出錯,這可能與編譯器有關。
相關文章
- c語言野指標與結構體指標動態記憶體分配小解C語言指標結構體記憶體
- C++ - 二級指標動態記憶體申請與釋放C++指標記憶體
- C語言 C語言野指標C語言指標
- C++ 指標動態記憶體分配C++指標記憶體
- C語言(動態記憶體分配)C語言記憶體
- c++動態記憶體管理與智慧指標C++記憶體指標
- FireFox記憶體自動釋放Firefox記憶體
- C++中的動態記憶體與智慧指標C++記憶體指標
- 學了指標沒學動態記憶體一切都白搭!C語言基礎教程之記憶體管理指標記憶體C語言
- C語言之動態記憶體管理C語言記憶體
- C語言malloc()函式:動態分配記憶體空間C語言函式記憶體
- Linux釋放記憶體及手動釋放Oracle共享記憶體段Linux記憶體Oracle
- c++動態記憶體智慧指標及weak_ptr用法的理解C++記憶體指標
- C語言記憶體管理,分配、使用、釋放以及安全性C語言記憶體
- C語言指標筆記C語言指標筆記
- win10如何設定自動釋放記憶體_win10怎麼設定自動清理系統垃圾釋放記憶體Win10記憶體
- 用動態記憶體讀入任意大小的檔案(c語言)記憶體C語言
- vector 避免記憶體頻繁分配釋放與手動釋放vector記憶體記憶體
- C指標與記憶體指標記憶體
- 記憶體動態分配與釋放,malloc和new區別記憶體
- Linux之 手動釋放記憶體Linux記憶體
- C++ 動態記憶體分配C++記憶體
- C++動態記憶體分配C++記憶體
- C 語言中的指標和記憶體洩漏指標記憶體
- C語言第九周作業(指標變數,記憶體訪問,取址,空指標)C語言指標變數記憶體
- 二維陣列的動態記憶體分配和釋放 (轉)陣列記憶體
- C語言(指標)C語言指標
- C語言指標C語言指標
- 函式中的指標分配的記憶體怎麼釋放函式指標記憶體
- 如何主動釋放 HeapIdle 的記憶體API記憶體
- Linux手動釋放快取記憶體Linux快取記憶體
- c和指標中關於動態分配記憶體malloc和qsort的一個例子指標記憶體
- 自動共享記憶體管理 自動記憶體管理 手工記憶體管理記憶體
- C/C++記憶體分配以及釋放C++記憶體
- C語言-記憶體分配C語言記憶體
- C語言:記憶體使用C語言記憶體
- C語言學習筆記:結構體與指標C語言筆記結構體指標
- C# 垃圾回收釋放記憶體C#記憶體