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

洛譯小筑

別來無恙,我的老友…
隨筆 - 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>
            老鸭窝91久久精品色噜噜导演| 美女露胸一区二区三区| 国产精品国产三级国产aⅴ入口| 欧美夜福利tv在线| 午夜日本精品| 久久婷婷国产麻豆91天堂| 亚洲一区二区三区精品在线观看| 日韩午夜免费视频| 一本大道久久a久久精二百| 亚洲视频图片小说| 久久成人综合网| 久久精品夜色噜噜亚洲a∨ | 欧美日韩第一页| 国产精品福利网| 国内偷自视频区视频综合| 亚洲国产日韩在线一区模特| 亚洲国产精品123| 亚洲一区二区三区精品在线| 亚洲一区二区在线看| 久久精品成人欧美大片古装| 欧美成人午夜视频| 午夜精品一区二区三区电影天堂 | 国产一区二区精品在线观看| 夜夜嗨av一区二区三区四季av | 久久久久国产精品厨房| 免费在线观看精品| 99国产精品久久久久久久| 国产精品捆绑调教| 亚洲欧美久久| 久久久久久久久久久久久女国产乱| 国产一区二区高清视频| 一区二区三区欧美激情| 亚洲精品在线电影| 欧美日韩中文在线| 在线综合+亚洲+欧美中文字幕| 免费看的黄色欧美网站| 久久欧美肥婆一二区| 国产伊人精品| 亚洲国产日韩一区| 欧美日韩国产欧| 亚洲欧洲一区二区在线播放| 亚洲国产影院| 国产精品福利在线观看网址| 欧美一区激情| 免费不卡中文字幕视频| 亚洲天堂av电影| 在线亚洲精品福利网址导航| 国产精品欧美日韩一区| 亚洲女女做受ⅹxx高潮| 午夜天堂精品久久久久| 在线欧美日韩精品| 日韩午夜中文字幕| 国产一区二区在线观看免费| 欧美搞黄网站| 亚洲欧美网站| 另类综合日韩欧美亚洲| 新狼窝色av性久久久久久| 久久人人看视频| 午夜视频一区在线观看| 久久视频国产精品免费视频在线| 黄色av日韩| 亚洲一区二区在线视频| 亚洲老司机av| 久久99伊人| 国产精品99久久久久久久女警| 亚洲图片欧美日产| 精品不卡一区二区三区| 99国产精品久久久久久久成人热| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 国产精品男人爽免费视频1| 一区二区三区四区国产| 欧美综合第一页| 亚洲伦理在线| 国内揄拍国内精品少妇国语| 久久久精品欧美丰满| 国产精品美女主播| 免费观看在线综合| 红桃视频一区| 欧美影院成人| 久久三级福利| 激情91久久| 欧美成人自拍视频| 亚洲国产精品精华液2区45| 亚洲片在线资源| 国产精品国产成人国产三级| 一区二区三区精品久久久| 亚洲在线免费观看| 精品1区2区3区4区| 一本色道久久综合狠狠躁的推荐| 免费在线看一区| 女主播福利一区| 亚洲视频在线观看视频| 欧美刺激午夜性久久久久久久| 亚洲缚视频在线观看| 亚洲黄色小视频| 亚洲欧美精品| 欧美在线看片a免费观看| 欧美在线视频一区二区| 亚洲电影免费观看高清完整版在线| 日韩午夜av电影| 欧美一区成人| 久久精品视频在线| 久久视频这里只有精品| 久久久久久久久伊人| 欧美区在线播放| 国产欧美在线视频| 亚洲国产日韩欧美在线动漫| 亚洲一区二区三区涩| 欧美搞黄网站| 久久久久亚洲综合| 国产一区91| 久久精品人人做人人爽电影蜜月| 妖精成人www高清在线观看| 欧美日本一道本| 99热这里只有精品8| 狼人社综合社区| 午夜免费久久久久| 国产欧美日韩综合一区在线观看 | 欧美国产亚洲视频| 国产情人综合久久777777| 日韩一级在线| 久久亚洲国产精品一区二区| 亚洲日韩第九十九页| 亚洲综合大片69999| 久久一综合视频| 久久成人羞羞网站| 欧美视频精品在线| 日韩亚洲一区二区| 欧美中日韩免费视频| 欧美一区视频| 欧美大尺度在线观看| 欧美在线观看www| 欧美日韩国产首页| 久久久精品一区| 国产精品久久国产精品99gif | 欧美一区午夜精品| 免费毛片一区二区三区久久久| 一区二区av| 久久美女性网| 欧美一级日韩一级| 欧美另类videos死尸| 亚洲成色999久久网站| 国内精品久久久久久久影视麻豆| 中文在线一区| 香蕉成人啪国产精品视频综合网| 欧美老女人xx| 一区二区免费看| 午夜在线观看免费一区| 久久视频一区| 国产一区二区黄色| 久久久国产精品一区二区三区| 亚洲视频观看| 欧美电影在线| 嫩草伊人久久精品少妇av杨幂| 国产精品久久久久av免费| 日韩视频在线一区二区| 日韩午夜电影av| 看欧美日韩国产| 老司机精品久久| 在线观看亚洲一区| 老**午夜毛片一区二区三区| 久久99在线观看| 欧美粗暴jizz性欧美20| 国产人成一区二区三区影院| 欧美一区网站| 久久精品免视看| 国内精品久久久久久 | 一区二区三区在线免费观看| 欧美一级电影久久| 老司机免费视频一区二区| 日韩天堂av| 亚洲国产精品高清久久久| 日韩视频一区二区三区在线播放免费观看| 翔田千里一区二区| 亚洲成色www8888| 亚洲制服丝袜在线| 国产一区91| 欧美大色视频| 老色批av在线精品| 欧美一级二区| 久久欧美肥婆一二区| 久久亚洲春色中文字幕| 毛片av中文字幕一区二区| 裸体一区二区三区| 欧美日本一区二区视频在线观看| 美女日韩欧美| 99热免费精品| 亚洲卡通欧美制服中文| 亚洲婷婷综合色高清在线| 好看不卡的中文字幕| 欧美日韩中文字幕| 欧美日本精品在线| 蜜桃精品久久久久久久免费影院| 午夜精品视频在线| 亚洲无线视频| 亚洲一区二区影院| 亚洲女ⅴideoshd黑人| av成人免费在线观看| 亚洲人成欧美中文字幕| 欧美国产视频在线|