當使用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。