条款五:对应的new和delete要采用相同的形式
上述程序的運行情況將是不可預測的。至少,stringarray指向的100個string對象中的99個不會被正確地摧毀,因為他們的析構函數永遠不會被調用。
用new的時候會發生兩件事。首先,內存被分配(通過operator new 函數,詳見條款7-10和條款m8),然后,為被分配的內存調用一個或多個構造函數。用delete的時候,也有兩件事發生:首先,為將被釋放的內存調用一個或多個析構函數,然后,釋放內存(通過operator delete 函數,詳見條款8和m8)。對于 delete來說會有這樣一個重要的問題:內存中有多少個對象要被刪除?答案決定了將有多少個析構函數會被調用。
如果你在用delete時沒用括號,delete就會認為指向的是單個對象,否則,它就會認為指向的是一個數組:
string *stringptr1 = new string; string *stringptr2 = new string[100]; ... delete stringptr1;// 刪除一個對象 delete [] stringptr2;// 刪除對象數組如果你在stringptr1前加了"[]"會怎樣呢?答案是:那將是不可預測的;如果你沒在stringptr2前沒加上"[]"又會怎樣呢?答案也是:不可預測。而且對于象int這樣的固定類型來說,結果也是不可預測的,即使這樣的類型沒有析構函數。所以,解決這類問題的規則很簡單:如果你調用new時用了[],調用delete時也要用[]。如果調用new時沒有用[],那調用delete時也不要用[]。
這個規則對喜歡用typedef的人來說也很重要,因為寫typedef的程序員必須告訴別人,用new創建了一個typedef定義的類型的對象后,該用什么形式的delete來刪除。舉例如下:
typedef string addresslines[4]; //一個人的地址,共4行,每行一個string//因為addresslines是個數組,使用new: string *pal = new addresslines; // 注意"new addresslines"返回string*, 和// "new string[4]"返回的一樣 delete時必須以數組形式與之對應: delete pal;// 錯誤! delete [] pal;// 正確?
轉載于:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3892182.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的条款五:对应的new和delete要采用相同的形式的全部內容,希望文章能夠幫你解決所遇到的問題。