歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++學習之動態內存管理常見三種錯誤

C++學習之動態內存管理常見三種錯誤

日期:2017/3/1 9:35:52   编辑:Linux編程

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個章節中:

  1. Linux-C成長之路(一):Linux下C編程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  2. Linux-C成長之路(二):基本數據類型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  3. Linux-C成長之路(三):基本IO函數操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  4. Linux-C成長之路(四):運算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  5. Linux-C成長之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  6. Linux-C成長之路(六):函數要義 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  7. Linux-C成長之路(七):數組與指針 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  8. Linux-C成長之路(八):存儲類,動態內存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  9. Linux-C成長之路(九):復合數據類型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  10. Linux-C成長之路(十):其他高級議題

Copyright © Linux教程網 All Rights Reserved