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

Shuffy

不斷的學習,不斷的思考,才能不斷的進步.Let's do better together!
posts - 102, comments - 43, trackbacks - 0, articles - 19
[轉]http://m.shnenglu.com/tiandejian/archive/2007/05/14/ec_16.html

第13條:     互相聯系的 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 需要用什么樣的格式呢?

如果你傾向于使用 typedef ,那么這一規則同樣值得你注意,因為它意味著 typedef 的創建者必須清楚:當 typedef 的類型中使用了 new 來創建對象,那么相應的 delete 語句中必須要使用同樣的格式。請看下邊的示例:

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 條)中包含了 string vector ,使用這些模板可以擺脫動態分配數組的煩惱。比如說,在這里, AddressLines 可以定義為一個字符串的向量,也就是 vector<string> 類型。

牢記在心

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            免费国产自线拍一欧美视频| 欧美在线免费观看亚洲| 亚洲电影视频在线| 免费观看国产成人| 久久永久免费| 欧美中文在线字幕| 欧美一级片一区| 亚洲欧美日韩国产一区二区三区| 亚洲国产精品va在线看黑人动漫 | 亚洲精品在线观看免费| 欧美大胆人体视频| 欧美一二三区精品| 欧美在线观看你懂的| 亚洲欧美亚洲| 欧美一区二区三区的| 欧美一区二区三区免费视| 欧美中在线观看| 久久精品国产精品| 免费一级欧美片在线观看| 亚洲电影专区| 亚洲一区二区三区成人在线视频精品| 亚洲午夜伦理| 久久视频精品在线| 欧美日韩日韩| 亚洲精品色图| 国产精品自在在线| 久久精品国产一区二区三区| 久久av资源网站| 久热精品在线| 国产精品电影在线观看| 国产一区二区三区观看| 亚洲国产一区二区精品专区| 在线中文字幕不卡| 久久久久高清| 亚洲人成在线影院| 中文亚洲欧美| 米奇777超碰欧美日韩亚洲| 欧美日本免费| 国产亚洲一区二区在线观看| 亚洲欧洲视频在线| 久久都是精品| 日韩一级大片在线| 久久久久女教师免费一区| 欧美日韩天天操| 尤物九九久久国产精品的分类| 一区二区欧美视频| 欧美二区在线播放| 欧美专区日韩专区| 国产精品久久久久7777婷婷| 亚洲精品1区2区| 久久精品国产一区二区三| 亚洲精品一二区| 久久婷婷av| 国产精品久久波多野结衣| 亚洲精品视频一区| 欧美成人午夜激情在线| 欧美一级视频精品观看| 欧美视频在线观看一区二区| 亚洲国产日韩欧美一区二区三区| 欧美在线观看网址综合| 一级日韩一区在线观看| 欧美激情中文不卡| 亚洲人精品午夜| 欧美freesex交免费视频| 亚洲先锋成人| 国产精品久久久久久久久久妞妞 | 亚洲成人在线网| 久久xxxx精品视频| 夜夜嗨av一区二区三区中文字幕 | 亚洲一区二区日本| 欧美午夜精品久久久| 一区二区三区久久精品| 欧美华人在线视频| 老司机成人在线视频| 亚洲国产一区视频| 亚洲第一在线综合在线| 久久国产精品免费一区| 亚洲国产精品免费| 亚洲激情影院| 欧美黑人一区二区三区| 亚洲国产电影| 欧美成人中文字幕在线| 久久久久久夜精品精品免费| 亚洲国产电影| 亚洲第一精品在线| 毛片av中文字幕一区二区| 亚洲高清中文字幕| 亚洲精品视频在线看| 欧美日韩aaaaa| 亚洲一区二区三区在线看| 亚洲一区二区三区视频播放| 国产精品二区三区四区| 亚洲在线观看免费| 亚洲影视在线播放| 黄色成人av网| 欧美激情亚洲精品| 欧美国产日本高清在线| 亚洲综合色在线| 亚洲婷婷综合久久一本伊一区| 欧美亚州韩日在线看免费版国语版| 夜夜夜久久久| 久久av二区| 亚洲国产影院| 亚洲精品小视频| 国产精品网站视频| 欧美成人自拍视频| 欧美日韩免费观看一区二区三区| 亚洲在线成人| 久久视频免费观看| 亚洲精品激情| 亚洲欧美日韩一区二区三区在线| 国产女人水真多18毛片18精品视频| 欧美一级视频精品观看| 久久国产综合精品| 亚洲精选视频免费看| 午夜在线精品偷拍| 亚洲国产天堂久久综合| 亚洲香蕉网站| 国产亚洲激情| 亚洲片国产一区一级在线观看| 国产精品福利网站| 亚洲二区在线观看| 国产原创一区二区| 亚洲天堂av在线免费观看| 在线观看国产精品淫| 日韩亚洲成人av在线| 精品福利电影| 亚洲一区二区在线免费观看| 亚洲精品美女在线| 久久精品水蜜桃av综合天堂| 亚洲欧美另类在线观看| 欧美日本在线观看| 亚洲国产欧美一区| 在线播放中文一区| 亚洲主播在线播放| 一区二区免费在线观看| 欧美大成色www永久网站婷| 久久综合网络一区二区| 国产手机视频一区二区| 99在线精品视频在线观看| 夜夜嗨av一区二区三区| 欧美日韩一区二区在线| 亚洲国内精品| 99视频+国产日韩欧美| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美美女喷水视频| 日韩一级不卡| 免费在线观看精品| 免费成人毛片| 今天的高清视频免费播放成人 | 欧美精品激情在线观看| 久久综合九色综合久99| 国产欧美精品一区| 欧美一区二区网站| 久久久久久久久久久久久久一区| 国产精品久久久久毛片大屁完整版| 亚洲精品一区二区三区四区高清| 亚洲毛片av| 欧美日本三级| 亚洲一区二区三区四区五区黄| 亚洲香蕉网站| 欧美日韩精品欧美日韩精品 | 亚洲福利视频网站| 伊人成年综合电影网| 久久久亚洲一区| 一区二区三区波多野结衣在线观看| 免费中文字幕日韩欧美| 亚洲欧洲一区二区三区在线观看| 亚洲成色777777女色窝| 久久在线视频在线| 亚洲高清视频的网址| 99亚洲精品| 国产乱码精品一区二区三| 先锋影音网一区二区| 裸体丰满少妇做受久久99精品| 韩国福利一区| 欧美激情第三页| 在线亚洲一区| 久久精品一区二区| 国产日韩在线看| 午夜宅男欧美| 欧美日韩1区2区| 亚洲精品资源| 亚洲女ⅴideoshd黑人| 欧美激情四色| 一区二区激情视频| 欧美亚洲视频| 欧美性做爰猛烈叫床潮| 亚洲丝袜av一区| 先锋影音久久久| 国产手机视频一区二区| 久久久人人人| 日韩视频一区二区三区在线播放免费观看 | 久久美女性网| 国产精品视频自拍| 国产欧美精品在线观看| 欧美黄色影院| 一本色道88久久加勒比精品| 中文在线不卡| 欧美xart系列高清|