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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

读书笔记 effective c++ Item 16 成对使用new和delete时要用相同的形式

發(fā)布時(shí)間:2024/4/17 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 读书笔记 effective c++ Item 16 成对使用new和delete时要用相同的形式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 一個(gè)錯(cuò)誤釋放內(nèi)存的例子

下面的場(chǎng)景會(huì)有什么錯(cuò)?

1 std::string *stringArray = new std::string[100]; 2 3 ... 4 5 delete stringArray

?

一切看上去都是有序的。new匹配了一個(gè)delete。但有一些地方確實(shí)是錯(cuò)了。程序的行為是未定義的。至少來(lái)說(shuō),stringArray指向的100個(gè)string對(duì)象中的99個(gè)看上去都不能被正確釋放,因?yàn)樗麄兊奈鰳?gòu)函數(shù)可能永遠(yuǎn)不會(huì)被調(diào)用。

2. 使用new 和delete時(shí)究竟做了啥?

當(dāng)你使用一個(gè)new表達(dá)式(通過(guò)使用new動(dòng)態(tài)的創(chuàng)建一個(gè)對(duì)象)時(shí),會(huì)發(fā)生兩件事情。第一,內(nèi)存被分配(通過(guò)一個(gè)叫做operator new的函數(shù),看Item 49和Item 51)。第二,在分配的內(nèi)存上調(diào)用了一個(gè)或多個(gè)構(gòu)造函數(shù)。當(dāng)你使用一個(gè)delete表達(dá)式時(shí),另外兩件事情會(huì)發(fā)生:在內(nèi)存上調(diào)用了一個(gè)或者多個(gè)析構(gòu)函數(shù),然后內(nèi)存被解除分配(通過(guò)調(diào)用叫做operator delete的函數(shù),見(jiàn) Item 51)。關(guān)于delete的一個(gè)重要的問(wèn)題是:在即將被刪除的內(nèi)存中究竟有多少對(duì)象?這個(gè)問(wèn)題的答案決定了有多少個(gè)析構(gòu)函數(shù)必須被調(diào)用。

?

3. new和delete不配對(duì)使用為啥會(huì)出錯(cuò)?

實(shí)際上,下面這個(gè)問(wèn)題更加簡(jiǎn)單:被刪除的指針是指向一個(gè)單獨(dú)的對(duì)象還是指向數(shù)組的所有對(duì)象?這是個(gè)關(guān)鍵的問(wèn)題,因?yàn)閱蝹€(gè)對(duì)象的內(nèi)存分配通常情況下同數(shù)組的內(nèi)存分配是不一樣的。特別的,一個(gè)數(shù)組的內(nèi)存通常包含了數(shù)組的大小,因此delete很容易就會(huì)知道需要調(diào)用多少個(gè)析構(gòu)函數(shù)。單個(gè)對(duì)象的內(nèi)存卻沒(méi)有這樣的信息。你可以將內(nèi)存不同分配想象成下面這個(gè)樣子,n是數(shù)組的大小:

?

當(dāng)然這只是一個(gè)例子。編譯器不需要這么實(shí)現(xiàn),雖然很多編譯器確實(shí)是這么實(shí)現(xiàn)的。

當(dāng)你在一個(gè)指針上使用delete時(shí),delete能夠知道數(shù)組容量信息是否存在的唯一方法就是通過(guò)你來(lái)告訴它。如果當(dāng)你使用delete時(shí)用了“[]”,delete認(rèn)為指針指向一個(gè)數(shù)組。否則,它會(huì)認(rèn)為它在指向一個(gè)單一的對(duì)象:

1 std::string *stringPtr1 = new std::string; 2 3 std::string *stringPtr2 = new std::string[100]; 4 5 ... 6 7 delete stringPtr1; // delete an object 8 9 delete [] stringPtr2; // delete an array of objects

?

4. new和delete不配對(duì)使用會(huì)有什么后果?

如果你在stringPtr1上使用“[]”將會(huì)發(fā)生什么?結(jié)果是未定義的,但是結(jié)果不會(huì)太好。假設(shè)內(nèi)存分布如上圖所示,delete會(huì)讀取一些內(nèi)存并把它所讀到的解釋為一個(gè)數(shù)組容量,接下來(lái)就開(kāi)始多次調(diào)用析構(gòu)函數(shù),卻忽略的以下事實(shí):它處理的內(nèi)存不但不是一個(gè)數(shù)組,也可能并沒(méi)有包含它正忙著釋放的那種類(lèi)型的對(duì)象。

如果你不在stringPtr2上使用“[]”會(huì)發(fā)生什么?結(jié)果也是未定義的,但是你可以看到這會(huì)導(dǎo)致過(guò)少的構(gòu)造函數(shù)被調(diào)用。此外,對(duì)于像int的內(nèi)建類(lèi)型來(lái)說(shuō)結(jié)果也是未定義的(有時(shí)甚至是有害的),雖然內(nèi)建類(lèi)型沒(méi)有析構(gòu)函數(shù)。

規(guī)則很簡(jiǎn)單:如果你在一個(gè)new表達(dá)式中使用”[]”,你必須在對(duì)應(yīng)的delete表達(dá)式中使用”[]”,反之亦然

當(dāng)你實(shí)現(xiàn)一個(gè)包含指向動(dòng)態(tài)分配內(nèi)存的指針的類(lèi),并且同時(shí)提供多個(gè)構(gòu)造函數(shù)的時(shí)候,你需要將上面的重要規(guī)則記在心中,因?yàn)槟惚仨毊?dāng)心在對(duì)構(gòu)造函數(shù)中對(duì)指針成員進(jìn)行初始化時(shí),new必須使用相同的形式。如果你不這么做,你又怎么能知道在析構(gòu)函數(shù)中將使用什么形式的delete呢?

5. 使用typedef時(shí)需要注意new和delete的配對(duì)使用

對(duì)于傾向于使用typedef的人來(lái)說(shuō)這條規(guī)則同樣值得注意,因?yàn)檫@意味著typedef的作者必須指出使用new來(lái)創(chuàng)建typedef類(lèi)型的對(duì)象時(shí),使用什么形式的delete對(duì)其進(jìn)行銷(xiāo)毀。看下面的例子:

1 typedef std::string AddressLines[4]; // a person’s address has 4 lines, 2 3 // each of which is a string

?

因?yàn)锳ddressLines是一個(gè)數(shù)組,new應(yīng)該這么使用:

1 std::string *pal = new AddressLines; // note that “new AddressLines” 2 3 // returns a string*, just like 4 5 // “new string[4]” would

使用delete的形式必須和new相匹配:

1 delete pal; // undefined! 2 3 delete [] pal; // fine

?

為了避免這種混淆,不如放棄在數(shù)組類(lèi)型上使用typedef。這很容易,因?yàn)闃?biāo)準(zhǔn)c++庫(kù)(見(jiàn)Item 54)中包含string,vector和模板,使得對(duì)動(dòng)態(tài)分配數(shù)組的需求幾乎將為0。這里我們舉個(gè)例子,AddressLines可以被定義成由strings組成的vector,也就是類(lèi)型 vector<string>。

轉(zhuǎn)載于:https://www.cnblogs.com/harlanc/p/6422351.html

與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的读书笔记 effective c++ Item 16 成对使用new和delete时要用相同的形式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。