• <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>
            面對現實,超越自己
            逆水行舟,不進則退
            posts - 269,comments - 32,trackbacks - 0

            有一天有個同事在通過vld調試一個內存泄漏問題,折騰了很久然后找到我。我瞥了一眼他的代碼,發現問題和我曾經遇到的一模一樣:

             1 class Base {
             2 public:
             3     ~Base();
             4 };
             5 
             6 class Derived : public Base {
             7 privated:
             8     std::vector<int> m_data;    };
             9 
            10 Base *obj = new Derived();
            11 delete obj;

            當然,實際代碼比這個復雜得多(這也是導致從發現問題到找到問題耗費大量時間的原因)。vld在報內存泄漏時,當然報的位置是new的地方。這個同事檢查了這個對象的整個生命周期,確定他正確地釋放了這個對象。

            問題的關鍵就在于:Base類的析構函數不是virtual。因為不是virtual,所以在對一個Base類型的指針進行delete時,就不會調用到派生類Derived的析構函數。而派生類里的析構函數會用于析構其內部的子對象,也就是這里的m_data。這樣,就造成了內存泄漏。

            這其實是一個很低級的失誤。但毫不客氣地說C++中有很多這種少個關鍵字或者代碼位置不對就會造成另一個結果的例子。事實上,針對這些悲劇也有很多書提出一些準則來讓大家去無腦遵守。例如針對這個例子,我就記得曾有書說,只要你覺得你的類會被繼承,那么最好給析構函數加上virtual。

            posted on 2012-09-14 13:54 王海光 閱讀(438) 評論(0)  編輯 收藏 引用 所屬分類: C++
            超级碰碰碰碰97久久久久| 久久强奷乱码老熟女网站| 2021国内久久精品| 97久久超碰成人精品网站| 精品一区二区久久| 伊人久久精品无码av一区| 国产AⅤ精品一区二区三区久久| 四虎国产精品成人免费久久| 久久99热精品| 国产高清美女一级a毛片久久w | 精品精品国产自在久久高清| 久久91这里精品国产2020| 亚洲欧美伊人久久综合一区二区| 久久中文字幕一区二区| 国产福利电影一区二区三区久久老子无码午夜伦不 | 狠狠88综合久久久久综合网| 久久国内免费视频| 欧美色综合久久久久久| 亚洲成人精品久久| 久久99精品国产| 国产午夜久久影院| 欧美久久精品一级c片片| 99久久精品影院老鸭窝| 国产 亚洲 欧美 另类 久久| 国产精品18久久久久久vr| 久久人搡人人玩人妻精品首页 | 99久久综合国产精品免费| 亚洲人成网站999久久久综合 | 国产成人久久精品一区二区三区| 狠狠色丁香久久婷婷综合_中| 国产69精品久久久久观看软件| 色8久久人人97超碰香蕉987| 国产2021久久精品| 精品久久久久久久久久中文字幕 | 久久影院久久香蕉国产线看观看| 久久成人永久免费播放| 久久精品国产一区| 久久噜噜电影你懂的| 国产综合久久久久久鬼色| www久久久天天com| 国产真实乱对白精彩久久|