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

洛譯小筑

別來無恙,我的老友…
隨筆 - 45, 文章 - 0, 評論 - 172, 引用 - 0
數據加載中……

[ECPP讀書筆記 條目16] 互相關聯的new和delete要使用同樣的形式

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

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

...

delete stringArray;

一切似乎都按部就班,new語句與delete相匹配。然而,這卻是大錯特錯的。這段程序將出現未定義行為。最起碼的是,由于該stringArray所指向的100個string對象中的99個沒有被析構函數所析構,它們將很有可能不會被銷毀。

當你使用了一個new語句時(也可以說,使用new動態創建了一個對象),將會發生兩件事情。第一,分配內存(通過一個名為operator new的函數,參見條目49和51)。第二,為這段內存調用一個或多個構造函數。當你使用了一個delete語句時,將會發生另外兩件事情:第一,為分配的內存調用一個或多個析構函數。第二,釋放內存(通過operator delete函數實現,參見條目51)。delete的關鍵問題是:內存中存在多少需要刪除的對象呢?答案取決于需要調用多少析構函數。

實際上,答案比這還要簡單:你正在刪除的指針是指向一個單獨的對象,還是一組對象?這個問題很關鍵,因為為單個對象分配的內存與為一系列對象分配的內存在形式上有本質的不同。具體地說,為數組分配的內存通常要保存數組的大小,這就使得delete很容易知道需要調用多少次析構函數。為單個對象分配的內存則不保存這一信息。你可以將這一差別想象成下邊圖中的樣子,其中n是數組的大小:

當然這僅僅是一個示例,并沒有強制指標要求編譯器以這種形式實現,盡管許多編譯器確實是這樣的。

當你對一個指針使用delete時,如何讓delete知道這一指針是否存在數組信息呢?這里只有一種方法,那就是親自告訴它。如果你在delete與指針名之間添加一對中括號,則delete便認為這一指針指向一個數組。否則將以單一對象處理。

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

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

...

 

delete stringPtr1;                 // 刪除一個對象

delete [] stringPtr2;              // 刪除一個對象數組

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

如果你不為stringPtr2使用“[]”將會發生什么呢?同樣會導致未定義行為。你可以看到由于它沒有調用足夠的析構函數,將造成內存泄漏。同時,對于內建數據類型,諸如int等,盡管它們沒有析構函數,這個做法也將帶來未定義行為(有時是有害的)。

這里的規則很簡單:如果你在一個new語句中使用了[],那么你必須在相關的delete語句中也使用[]。如果你在一個new語句中沒有使用[],那么在相關的delete語句中也不應使用[]

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

如果你傾向于使用typedef,那么這一規則同樣值得你注意,因為它意味著:當你使用了new來創建typedef類型的對象時,至于應該使用delete語句的哪種形式,typedef的作者必須事先做出說明。請看下邊的示例:

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

                                   // 每行都是一個字符串

由于AddressLines是一個數組, 如果這樣使用了new

std::string *pal = new AddressLines;   // 請注意“new AddressLines

                                   // 返回一個string*

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

那么delete就必須使用數組的格式:

delete pal;                        // 將出現未定義行為!

delete [] pal;                     // 工作正常

為了避免此類混淆,請不要使用typedef來定義數組。這十分簡單,因為C++標準庫(參見條目54)中包含了stringvector,使用這些模板可以擺脫動態分配數組的煩惱。比如說,在這里,AddressLines可以定義為一個字符串的向量,也就是vector<string>類型。

時刻牢記

如果你在一個new語句中使用了[],那么你必須要在相關的delete語句中使用[]。如果你在new語句中沒有使用[],那么在相關的delete語句中一定不要出現[]

posted on 2007-05-14 22:15 ★ROY★ 閱讀(1123) 評論(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>
            国产亚洲日本欧美韩国| 裸体歌舞表演一区二区| 欧美精品首页| 亚洲小说欧美另类婷婷| 亚洲一区二区三区激情| 国产精品久久久久久久久久久久| 亚洲第一成人在线| 亚洲欧洲在线一区| 欧美视频精品在线| 久久精品99国产精品| 亚洲欧美电影在线观看| 激情丁香综合| 亚洲国产精品123| 欧美日本国产一区| 欧美一区影院| 欧美黄色片免费观看| 亚洲一区二区3| 久久久国产精品一区| 亚洲成在人线av| 亚洲欧洲另类| 亚洲图片欧美一区| 玉米视频成人免费看| 亚洲人成久久| 国产一区二区三区奇米久涩| 麻豆精品91| 国产精品久久久久毛片大屁完整版 | 久久久水蜜桃| 久久深夜福利| 亚洲欧美日韩中文播放| 久久久久中文| 亚洲午夜激情在线| 久久久久久综合| 亚洲欧美另类在线| 欧美成人激情视频| 亚洲一区二区3| 裸体丰满少妇做受久久99精品| 午夜精品久久久久99热蜜桃导演| 久久综合色婷婷| 欧美一区午夜精品| 欧美三级不卡| 亚洲精品中文字幕有码专区| 精品电影在线观看| 性色av香蕉一区二区| 亚洲午夜黄色| 欧美精品久久99| 欧美激情二区三区| 好吊视频一区二区三区四区| 亚洲欧美激情四射在线日 | 欧美精品一区二区在线播放| 欧美ab在线视频| 狠狠色丁香久久综合频道| 中文日韩在线| 亚洲男女毛片无遮挡| 欧美精品在线视频| 亚洲激情一区二区三区| 在线播放豆国产99亚洲| 欧美亚洲一区三区| 久久国产精品久久久久久电车| 欧美色区777第一页| 亚洲精品视频在线观看网站| 亚洲激情一区| 女人色偷偷aa久久天堂| 蜜臀久久久99精品久久久久久| 国产亚洲精品高潮| 欧美专区在线播放| 久久久亚洲国产美女国产盗摄| 韩日在线一区| 久久久久久国产精品一区| 久久亚洲综合网| 精品999在线播放| 久久综合伊人77777蜜臀| 免费观看成人鲁鲁鲁鲁鲁视频 | 国产视频亚洲精品| 欧美一区亚洲一区| 久久人体大胆视频| 亚洲国产精品传媒在线观看 | 久久久久中文| 免费av成人在线| 亚洲第一中文字幕在线观看| 久久久国产一区二区| 欧美激情第三页| a91a精品视频在线观看| 国产精品99一区| 欧美一区二区三区在线播放| 老司机午夜免费精品视频| 亚洲激情国产| 国产精品ⅴa在线观看h| 欧美一级专区| 亚洲国内高清视频| 新狼窝色av性久久久久久| 一区三区视频| 欧美人在线视频| 欧美一区二区三区在线视频 | 蜜臀久久久99精品久久久久久| 亚洲精品免费看| 国产嫩草一区二区三区在线观看 | 午夜亚洲性色视频| 欧美激情一区二区久久久| 亚洲午夜一区| **性色生活片久久毛片| 欧美午夜无遮挡| 久久久噜噜噜| 99精品国产在热久久婷婷| 久久久99久久精品女同性| 亚洲乱亚洲高清| 国产主播一区二区三区| 欧美日韩成人免费| 欧美影视一区| 亚洲午夜精品视频| 欧美福利小视频| 久久久久国产精品www| 99热在这里有精品免费| 含羞草久久爱69一区| 国产精品高精视频免费| 免费视频一区| 久久精品国产2020观看福利| 在线视频中文亚洲| 亚洲福利久久| 久久在线观看视频| 亚洲自拍三区| 亚洲视频成人| 99亚洲伊人久久精品影院红桃| 精品成人国产| 国产视频在线观看一区二区三区 | 欧美一区二区三区免费看| 在线亚洲观看| 亚洲精品网址在线观看| 欧美国产免费| 欧美刺激午夜性久久久久久久| 久久精品国产一区二区三区| 午夜亚洲性色视频| 亚洲曰本av电影| 中日韩美女免费视频网站在线观看| 亚洲国产精品一区二区久| 狠狠色综合日日| 国语自产精品视频在线看抢先版结局 | 欧美成人一区在线| 在线亚洲自拍| 夜夜嗨av一区二区三区中文字幕| 久久久久久久久久久一区| 亚洲一区精品在线| 亚洲深夜福利视频| 亚洲性感激情| 亚洲一区欧美激情| 亚洲午夜一区二区三区| 亚洲一二三区视频在线观看| 在线一区二区视频| 亚洲一区三区视频在线观看| 亚洲午夜黄色| 小黄鸭精品密入口导航| 午夜视频在线观看一区二区| 欧美一级专区| 久久蜜桃资源一区二区老牛 | 亚洲精品麻豆| 国产精品99久久久久久久vr| 亚洲一级黄色| 欧美资源在线观看| 久久在线观看视频| 欧美华人在线视频| 亚洲久久在线| 亚洲欧美欧美一区二区三区| 午夜视频一区在线观看| 久久久久久夜| 欧美日韩成人免费| 国产精品普通话对白| 国产一区二区三区在线播放免费观看| 国产资源精品在线观看| 亚洲黄色视屏| 亚洲欧美日韩第一区| 久久嫩草精品久久久久| 91久久精品一区| 亚洲在线观看视频| 久久天天躁夜夜躁狠狠躁2022| 欧美成人小视频| 国产日韩在线看片| 亚洲人体1000| 欧美自拍偷拍| 亚洲日本在线观看| 欧美一区二区三区电影在线观看| 欧美高清视频免费观看| 国产精品日韩欧美综合| 亚洲成人影音| 欧美专区中文字幕| 91久久精品视频| 久久激情婷婷| 国产精品高潮呻吟久久| 狠狠久久亚洲欧美| 亚洲综合色激情五月| 欧美成年人网站| 亚洲欧美另类国产| 欧美日韩国产经典色站一区二区三区| 国产精品日韩在线观看| 亚洲人成在线播放| 久久伊人免费视频| 亚洲午夜影视影院在线观看| 欧美激情成人在线| 亚洲福利在线看| 久久精品国产亚洲a| 亚洲午夜免费福利视频| 欧美日韩视频第一区|