• <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>

            Shuffy

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

            第13條:     互相聯(lián)系的 new delete 要使用同樣的形式

            請觀察下面的代碼有什么不妥之處:

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

            ...

            delete stringArray;

            一切似乎都按部就班, new 語句與 delete 相匹配。然而,這卻是十分錯誤的。這段程序?qū)⒊霈F(xiàn)無法預(yù)知的行為。最起碼的是,由于該 stringArray 所指向的 100 string 對象中的 99 個沒有被析構(gòu)函數(shù)所析構(gòu),它們將很有可能得不到銷毀。

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

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

             

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

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

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

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

            ...

             

            delete stringPtr1;                 // 刪除一個對象

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

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

            如果你不為 stringPtr2 使用“ [] ”將會發(fā)生什么呢?我們也可以說,這樣做同樣的不到預(yù)期的效果。你可以看到由于它沒有調(diào)用足夠的析構(gòu)函數(shù),于是將造成內(nèi)存泄漏。同時,對于內(nèi)建數(shù)據(jù)類型,諸如 int 等,盡管它們沒有析構(gòu)函數(shù),但同樣也會帶來無法預(yù)期的結(jié)果(有時是有害的)。

            這里的規(guī)則很簡單:如果你在一個 new 語句中使用了 [] ,那么你必須在相關(guān)的 delete 語句中也使用 [] 。反之亦然。

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

            如果你傾向于使用 typedef ,那么這一規(guī)則同樣值得你注意,因?yàn)樗馕吨?/span> typedef 的創(chuàng)建者必須清楚:當(dāng) typedef 的類型中使用了 new 來創(chuàng)建對象,那么相應(yīng)的 delete 語句中必須要使用同樣的格式。請看下邊的示例:

            typedef std::string AddressLines[4];

                                               // 每個人的地址有 4 行,

                                               // 每行都是一個字符串

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

            std::string *pal = new AddressLines;

                                               // 請注意“ new AddressLines

                                               // 返回一個 string*

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

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

            delete pal;                        // 將出現(xiàn)無法預(yù)知的行為!

            delete [] pal;                        // 工作正常

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

            牢記在心

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

            久久婷婷五月综合成人D啪 | 久久九九久精品国产| 久久精品视频网| 久久久久国色AV免费看图片| 久久久久99这里有精品10| 久久er热视频在这里精品| 欧美久久亚洲精品| 久久精品国产精品青草app| 久久99热这里只有精品66| 激情久久久久久久久久| 精品久久香蕉国产线看观看亚洲| 精品无码久久久久久国产| 亚洲熟妇无码另类久久久 | 亚洲精品tv久久久久| 久久国产精品-国产精品| 久久中文字幕人妻丝袜| 思思久久99热免费精品6| 国产亚洲美女精品久久久久狼| 久久久久久精品久久久久| 久久性生大片免费观看性| 精品久久久久久久久久中文字幕| 无码人妻久久一区二区三区| 国色天香久久久久久久小说| 久久久这里有精品中文字幕| 狠狠色伊人久久精品综合网| 国产国产成人精品久久| 伊人久久大香线焦综合四虎| 99久久人妻无码精品系列| 99久久婷婷国产综合亚洲| 久久成人国产精品| 国产精品免费久久久久影院| 久久精品无码一区二区app| 国产免费久久精品丫丫| 久久夜色精品国产亚洲| 久久99亚洲综合精品首页| 久久99精品久久久久久秒播| 四虎国产永久免费久久| 久久国产美女免费观看精品 | 国产精品久久久久久一区二区三区| 久久国产精品一国产精品金尊| 久久久久99精品成人片欧美|