日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

条款五:对应的new和delete要采用相同的形式

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 条款五:对应的new和delete要采用相同的形式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
string *stringarray = new string[100]; ... delete stringarray;

上述程序的運行情況將是不可預測的。至少,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要采用相同的形式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。