C++ new、delete、malloc、free

来自KlniuWiki
跳转到: 导航, 搜索

1 new、delete、malloc、free關係

delete會調用對象的析構函數,和new對應,free只會釋放內存,new調用構造函數。malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符。它們都可用於申請動態內存和釋放內存。對於非內部數據類型的對象而言,光用maloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。由於malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加於malloc/free。因此C++語言需要一個能完成動態內存分配和初始化工作的運算符new,以及一個能完成清理與釋放內存工作的運算符delete。注意new/delete不是庫函數。

2 delete與delete[]區別

delete只會調用一次析構函數,而delete[]會調用每一個成員的析構函數。在More Effective C++中有更為詳細的解釋:「當delete操作符用於數組時,它為每個數組元素調用析構函數,然後調用operatordelete來釋放內存。」delete與New配套,delete []與new []配套

 
  MemTest *mTest1=new MemTest[10];
  MemTest *mTest2=new MemTest;
  int *pInt1=new int[10];
  int *pInt2=new int; 
  delete [] pInt1;  //-1-
  delete [] pInt2;  //-2-
  delete [] mTest1;//-3-
  delete [] mTest2;//-4-

以上語句,在-4-處報錯。

這就說明:對於內建簡單數據類型,delete和delete[]功能是相同的。對於自定義的複雜數據類型,delete和delete[]不能互用。delete[]刪除一個數組,delete刪除一個指針,簡單來說,用new分配的內存用delete刪除,用new[]分配的內存用delete[]刪除,delete[]會調用數組元素的析構函數。內部數據類型沒有析構函數,所以問題不大。如果你在用delete時沒用括號,delete就會認為指向的是單個對象,否則,它就會認為指向的是一個數組。

3 參見

  • c++筆試面試寶典2009版. 左手也瘋狂
个人工具
分类
化学
[×] 國學
学佛
[×] 数学
物理
生活
[×] 英语
读书
辞典
廣告