青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

洛譯小筑

別來無恙,我的老友…
隨筆 - 45, 文章 - 0, 評(píng)論 - 172, 引用 - 0
數(shù)據(jù)加載中……

[ECPP讀書筆記 條目16] 互相關(guān)聯(lián)的new和delete要使用同樣的形式

下面的情景有什么不妥之處呢?

std::string *stringArray = new std::string[100];

...

delete stringArray;

一切似乎都按部就班,new語句與delete相匹配。然而,這卻是大錯(cuò)特錯(cuò)的。這段程序?qū)⒊霈F(xiàn)未定義行為。最起碼的是,由于該stringArray所指向的100個(gè)string對(duì)象中的99個(gè)沒有被析構(gòu)函數(shù)所析構(gòu),它們將很有可能不會(huì)被銷毀。

當(dāng)你使用了一個(gè)new語句時(shí)(也可以說,使用new動(dòng)態(tài)創(chuàng)建了一個(gè)對(duì)象),將會(huì)發(fā)生兩件事情。第一,分配內(nèi)存(通過一個(gè)名為operator new的函數(shù),參見條目49和51)。第二,為這段內(nèi)存調(diào)用一個(gè)或多個(gè)構(gòu)造函數(shù)。當(dāng)你使用了一個(gè)delete語句時(shí),將會(huì)發(fā)生另外兩件事情:第一,為分配的內(nèi)存調(diào)用一個(gè)或多個(gè)析構(gòu)函數(shù)。第二,釋放內(nèi)存(通過operator delete函數(shù)實(shí)現(xiàn),參見條目51)。delete的關(guān)鍵問題是:內(nèi)存中存在多少需要?jiǎng)h除的對(duì)象呢?答案取決于需要調(diào)用多少析構(gòu)函數(shù)。

實(shí)際上,答案比這還要簡(jiǎn)單:你正在刪除的指針是指向一個(gè)單獨(dú)的對(duì)象,還是一組對(duì)象?這個(gè)問題很關(guān)鍵,因?yàn)闉閱蝹€(gè)對(duì)象分配的內(nèi)存與為一系列對(duì)象分配的內(nèi)存在形式上有本質(zhì)的不同。具體地說,為數(shù)組分配的內(nèi)存通常要保存數(shù)組的大小,這就使得delete很容易知道需要調(diào)用多少次析構(gòu)函數(shù)。為單個(gè)對(duì)象分配的內(nèi)存則不保存這一信息。你可以將這一差別想象成下邊圖中的樣子,其中n是數(shù)組的大?。?/p>

當(dāng)然這僅僅是一個(gè)示例,并沒有強(qiáng)制指標(biāo)要求編譯器以這種形式實(shí)現(xiàn),盡管許多編譯器確實(shí)是這樣的。

當(dāng)你對(duì)一個(gè)指針使用delete時(shí),如何讓delete知道這一指針是否存在數(shù)組信息呢?這里只有一種方法,那就是親自告訴它。如果你在delete與指針名之間添加一對(duì)中括號(hào),則delete便認(rèn)為這一指針指向一個(gè)數(shù)組。否則將以單一對(duì)象處理。

std::string *stringPtr1 = new std::string;

std::string *stringPtr2 = new std::string[100];

...

 

delete stringPtr1;                 // 刪除一個(gè)對(duì)象

delete [] stringPtr2;              // 刪除一個(gè)對(duì)象數(shù)組

如果你為stringPtr1使用“[]”時(shí)將會(huì)發(fā)生什么呢?我們說,會(huì)導(dǎo)致未定義行為。假設(shè)使用上面的內(nèi)存分配形式,delete將會(huì)讀入一些內(nèi)存信息,并且將其理解為數(shù)組的長(zhǎng)度,然后便開始調(diào)用這么多的析構(gòu)函數(shù),此時(shí)delete不僅忽視了它正在操作的內(nèi)存上保存的并不是數(shù)組,同時(shí)它“辛辛苦苦”析構(gòu)的東西很有可能都不是它所能操作的類型。

如果你不為stringPtr2使用“[]”將會(huì)發(fā)生什么呢?同樣會(huì)導(dǎo)致未定義行為。你可以看到由于它沒有調(diào)用足夠的析構(gòu)函數(shù),將造成內(nèi)存泄漏。同時(shí),對(duì)于內(nèi)建數(shù)據(jù)類型,諸如int等,盡管它們沒有析構(gòu)函數(shù),這個(gè)做法也將帶來未定義行為(有時(shí)是有害的)。

這里的規(guī)則很簡(jiǎn)單:如果你在一個(gè)new語句中使用了[],那么你必須在相關(guān)的delete語句中也使用[]。如果你在一個(gè)new語句中沒有使用[],那么在相關(guān)的delete語句中也不應(yīng)使用[]。

有時(shí)候你會(huì)編寫這樣的類:它們包含用來動(dòng)態(tài)分配內(nèi)存的指針,并且提供多個(gè)構(gòu)造函數(shù)。此時(shí)你需要時(shí)刻注意遵守上面的規(guī)則。在所有的構(gòu)造函數(shù)中,你必須使用一致格式的new來初始化指針成員。如果你不這樣做,你怎么能知道析構(gòu)函數(shù)中delete需要用什么樣的格式呢?

如果你傾向于使用typedef,那么這一規(guī)則同樣值得你注意,因?yàn)樗馕吨寒?dāng)你使用了new來創(chuàng)建typedef類型的對(duì)象時(shí),至于應(yīng)該使用delete語句的哪種形式,typedef的作者必須事先做出說明。請(qǐng)看下邊的示例:

typedef std::string AddressLines[4]    // 每個(gè)人的地址有4行,

                                   // 每行都是一個(gè)字符串

由于AddressLines是一個(gè)數(shù)組, 如果這樣使用了new

std::string *pal = new AddressLines;   // 請(qǐng)注意“new AddressLines

                                   // 返回一個(gè)string*,

                                   // 與“new string[4]”完全一樣

那么delete就必須使用數(shù)組的格式:

delete pal;                        // 將出現(xiàn)未定義行為!

delete [] pal;                     // 工作正常

為了避免此類混淆,請(qǐng)不要使用typedef來定義數(shù)組。這十分簡(jiǎn)單,因?yàn)镃++標(biāo)準(zhǔn)庫(參見條目54)中包含了stringvector,使用這些模板可以擺脫動(dòng)態(tài)分配數(shù)組的煩惱。比如說,在這里,AddressLines可以定義為一個(gè)字符串的向量,也就是vector<string>類型。

時(shí)刻牢記

如果你在一個(gè)new語句中使用了[],那么你必須要在相關(guān)的delete語句中使用[]。如果你在new語句中沒有使用[],那么在相關(guān)的delete語句中一定不要出現(xiàn)[]。

posted on 2007-05-14 22:15 ★ROY★ 閱讀(1122) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Effective C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            美日韩免费视频| 久久精彩免费视频| 亚洲乱码国产乱码精品精天堂 | 亚洲视频播放| 在线亚洲一区二区| 国产欧美日韩三级| 欧美大成色www永久网站婷| 欧美超级免费视 在线| 亚洲午夜电影网| 欧美一级一区| 亚洲日本中文字幕| 中文亚洲欧美| 在线免费观看日本欧美| 亚洲区第一页| 国产精品日韩欧美| 女仆av观看一区| 欧美午夜不卡在线观看免费| 欧美一区三区三区高中清蜜桃| 久久久精品国产99久久精品芒果| 日韩一级二级三级| 亚洲欧美日韩第一区| 日韩午夜av| 亚洲国产精品日韩| 国产精品日韩一区| 亚洲高清在线观看一区| 国产精品美女久久久久久免费| 美日韩精品免费| 国产精品福利av| 亚洲电影欧美电影有声小说| 国产精品一区二区在线观看| 亚洲国产成人av| 国产亚洲免费的视频看| 99成人在线| 91久久精品一区二区别| 欧美一区=区| 亚洲欧美日韩在线一区| 欧美成人一区二区| 噜噜噜91成人网| 国产精品www.| 亚洲国产视频一区二区| 激情av一区二区| 亚洲资源在线观看| 亚洲视频日本| 欧美极品aⅴ影院| 欧美成人中文字幕在线| 国产午夜久久| 午夜精品一区二区三区在线播放 | 国产精品久久久久影院色老大| 欧美国产欧美亚洲国产日韩mv天天看完整 | 夜夜狂射影院欧美极品| 亚洲成色精品| 久久精品免费看| 久久精品欧美日韩| 国产女人精品视频| 亚洲性色视频| 亚洲自拍偷拍网址| 国产精品www994| 亚洲一区二区成人| 亚洲欧美日韩成人高清在线一区| 欧美日韩成人一区二区三区| 91久久精品一区二区别| 亚洲免费观看| 欧美日韩成人一区| 99精品久久免费看蜜臀剧情介绍| 亚洲人成小说网站色在线| 麻豆国产va免费精品高清在线| 免费视频久久| 亚洲人成毛片在线播放女女| 欧美福利视频一区| 日韩视频精品在线| 午夜精品久久久久久久久| 国产精品久久久久久久久久三级| 亚洲一区二区三区在线视频| 午夜在线视频观看日韩17c| 国产精品免费网站| 欧美一区二区三区视频在线| 久久男女视频| 亚洲愉拍自拍另类高清精品| 好吊妞**欧美| 依依成人综合视频| 亚洲丁香婷深爱综合| 亚洲福利视频网站| 日韩亚洲在线观看| 午夜伦欧美伦电影理论片| 欧美在线一二三区| 亚洲国产日韩一区| 亚洲一区二区视频在线| 女生裸体视频一区二区三区| 欧美三级电影一区| 亚洲国产精品黑人久久久| 性欧美大战久久久久久久久| 欧美成人午夜激情| 亚洲免费伊人电影在线观看av| 久久一区二区三区国产精品| 国产精品区一区二区三区| 亚洲精品久久久久中文字幕欢迎你 | 在线日韩成人| 校园春色综合网| 一区二区三区回区在观看免费视频| 亚洲婷婷综合色高清在线| 麻豆精品视频| 亚洲国产欧美在线| 久久久久久网| 午夜精品久久久久久久白皮肤 | 在线一区日本视频| 女人色偷偷aa久久天堂| 亚洲视频欧美视频| 欧美剧在线观看| 一区二区三区国产在线观看| 欧美国产丝袜视频| 欧美久久九九| 亚洲图片欧美一区| 亚洲一区二区三区欧美| 国产精品推荐精品| 久久精品国产96久久久香蕉| 欧美在现视频| 国产亚洲欧美日韩精品| 欧美在线免费视屏| 老司机凹凸av亚洲导航| 夜夜夜久久久| 亚洲永久在线| 亚洲电影毛片| 在线一区欧美| 亚洲精品久久久久久一区二区| 亚洲日本在线观看| 国产欧美高清| 亚洲欧洲视频在线| 国产主播一区| 亚洲一区亚洲| 亚洲午夜一级| 麻豆精品视频在线观看| 久久精品国产清高在天天线| 欧美高清在线视频观看不卡| 久久精品最新地址| 欧美色123| 一区二区三区国产盗摄| 亚洲欧洲在线播放| 久久人人爽人人爽| 裸体歌舞表演一区二区| 国产精品一级二级三级| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美一级成年大片在线观看| 久久久精品网| 欧美成人国产一区二区| 国产亚洲高清视频| 性18欧美另类| 老牛影视一区二区三区| 在线观看亚洲一区| 免费观看日韩| 在线视频精品一区| 久久爱www久久做| 激情懂色av一区av二区av| 久久久国产91| 欧美激情一区在线| 一区二区三区高清视频在线观看| 欧美日韩一二三四五区| 亚洲女同精品视频| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲九九九在线观看| 欧美日韩在线观看视频| 欧美制服丝袜第一页| 亚洲人成网站在线观看播放| 亚洲综合视频网| 在线观看日韩国产| 国产精品久久国产精品99gif| 午夜一区二区三区在线观看| 欧美福利网址| 久久久久www| 亚洲一区二区在线| 亚洲乱码久久| 亚洲高清久久久| 国产一区二区三区在线免费观看| 免费观看在线综合| 久久综合99re88久久爱| 欧美一区二区视频在线观看2020| 亚洲精品自在久久| 亚洲精品韩国| 亚洲国产精品第一区二区三区| 久久一区二区三区av| 久久精彩免费视频| 久久成人免费电影| 久久久久久欧美| 久久先锋影音| 欧美成年人视频网站欧美| 久热精品在线视频| 欧美电影打屁股sp| 亚洲第一页中文字幕| 欧美激情片在线观看| 亚洲国内欧美| 亚洲视频碰碰| 亚洲欧美网站| 久久精品一二三| 麻豆精品视频在线观看| 欧美日韩国产综合久久| 欧美激情视频一区二区三区不卡| 亚洲欧美日本国产有色| 欧美成人视屏| 99精品欧美一区二区蜜桃免费| 久久九九国产精品怡红院| 久久久久一区二区三区|