程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 條款16:成對使用new和delete時要使用相同的形式

條款16:成對使用new和delete時要使用相同的形式

編輯:C++入門知識

 

當使用new時(即通過new動態生成一個對象

當使用delete時,也有兩件事發生:針對此內存會有一個(或更多)析構函數被調用,然後內存才被釋放(通過名為operator delete 的函數)。delete的最大問題在於:即將被刪除的內存之內有究竟存有多少對象?(即將被刪除的那個指針,所指的是單一對象或對象數組?)此問題的答案決定了又多少個析構函數必須被調用起來。

單一對象的內存布局不同於對象數組的內存布局:數組所用的內存包括“數組大小”記錄,以便delete制定需要調用多少次析構函數。單一對象的內存則沒有這筆記錄。

delete[]認定指針指向一個數組,多次調用析構函數。因此切記 new和delete時要采取相同形式。

std::string* strPtr1 = new std::string;      
std::string* strPtr2 = new std::string[100]; 
...
delete strPtr1;     //刪除一個對象          
delete [] strPtr2;   //刪除一個由對象組成的數組

如果對strPtr1使用delete[]形式:delete會讀取若干內存並解釋為“數組大小”,然後多次調用析構函數。

如果對strPtr2沒使用delete[]形式:可能導致99個析構函數沒被調用,對象不太可能被適當刪除。

也就是說,以上的兩種情況都可能會導致不確定的行為喲~

對於typedef動作,當以new創建該種typedef類型對象時,應該說清楚應該以哪一種delete形式刪除。

考慮下面這個例子:

typedef std::string AddressLines[4];//每個人的地址有4行 每行是一個string

//AddressLines是個數組,如果這樣使用new:
std::string* pal = new AddressLines;//返回一個string* 跟new string[4]一樣

那就必須匹配“數組形式”的delete[]:

delete pal;      //行為未有定義!!!
delete [] pal;   //OK

為避免諸如此類的錯誤,最好盡量不要對數組形式做typedef動作。取而代之可以使用vector<string>等templates。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved