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