請牢記:數組
若是在new表達式中使用[],必須在相應的delete表達式中也使用[]。 new[] 對應 delete[]函數
如歌在new表達式中不適用[],必定不要在相應的delete表達式中使用[]。 new 對應 delete佈局
當使用new時(即經過new動態生成一個對象),有兩件事發生:第一,內存被分配出來(經過名爲operator new 的函數);第二,針對此內存會有一個(或更多)構造函數被調用。spa
當使用delete時,也有兩件事發生:針對此內存會有一個(或更多)析構函數被調用,而後內存才被釋放(經過名爲operator delete 的函數)。delete的最大問題在於:即將被刪除的內存以內有究竟存有多少對象?(即將被刪除的那個指針,所指的是單一對象或對象數組?)此問題的答案決定了又多少個析構函數必須被調用起來。指針
單一對象的內存佈局不一樣於對象數組的內存佈局:數組所用的內存包括「數組大小」記錄,以便delete制定須要調用多少次析構函數。單一對象的內存則沒有這筆記錄。對象
delete[]認定指針指向一個數組,屢次調用析構函數。所以切記 new和delete時要採起相同形式。blog
std::string* strPtr1 = new std::string; std::string* strPtr2 = new std::string[100]; ... delete strPtr1; //刪除一個對象 delete [] strPtr2; //刪除一個由對象組成的數組
若是對strPtr1使用delete[]形式:delete會讀取若干內存並解釋爲「數組大小」,而後屢次調用析構函數。內存
若是對strPtr2沒使用delete[]形式:可能致使99個析構函數沒被調用,對象不太可能被適當刪除。string
也就是說,以上的兩種狀況均可能會致使不肯定的行爲喲~class
對於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。