C++中動態內存管理經常出現錯誤,現在我們通過簡單的例子對其進行梳理。
1. 動態創建對象的方法,用new來創建,以整型為例
int * pi = new int; //pi points to an dynamically allocatedunnamed, uninitialized int
上面的語句就在自由存儲區(堆)創建了一個動態的,未命名,未初始化的對象,並將指向該對象的指針賦於pi。
2.動態對象的刪除,用delete來刪除動態對象。刪除之後,指針就變在懸垂指針(dangling pointer),懸垂指針仍然曾經存放對象的內存,但該對象已經不存在了。作為實踐,刪除之後,最好給指針賦0值。
delete pi; // now pi is a dangling pointer
pi = 0;
3. 常見的三類錯誤
3.1 忘記刪除動態對象,或者刪除失敗。這時會無法將該內存返還給自由存儲區,造成“內存洩露(memory leak)”,可能最終導致耗盡所有內存空間,例如下面的代碼就忘記刪除pi指向的動態對象,出現了內存洩露。
3.2 讀寫己刪除的對象。例如
上面的程序之所以達不到預期效果,是因為ipvec[0]和pi指向同一對象,而這一對象已經被刪除,22行還是要讀這一對象,因此結果會出錯。
3.3 對同一個內存空間使用兩次delete表達式。下面是一例:
這個例子對同一塊內存區進行了兩次delete操作,很可能造成的後果是,自由存儲區被破壞。
總之,操縱動態內存時,很容易出現以上三類錯誤,而且很難追蹤。
[參考文獻]:C++ Primer, chapter5
C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm
讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm
讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm
讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm
將C語言梳理一下,分布在以下10個章節中: