基類虛析構函數。

在調程序是發現下面代碼在release的時候crash

interface ITest2:public  IUnknown
{
    virtual void bb()=0;
};

class CTest1Imp:public ITest
{
    virtual void aa(){};
};

class CAAA:public CTest1Imp, public ITest2,private CIUnknownImp
{
public:

    virtual void bb(){};

    CODE_IUNKNOW_IMP
};


        CAAA *pa = new CAAA;
        pa->Release();//調這句會crash

後來修改CAAA的繼承順序,把CIUnknownImp放在最前就不會crash,
繼承順序不一樣會有這麼大的後果?。
繼續跑程序發現,程序有內存泄漏。CAAA的析構居然不會被調到。

後來才發現是CIUnknownImp裏面的析構函數沒寫,缺省不是virtual導致的。
加上之後一切OK。

################################

CComPtr使用。

下面的調法是沒用的(GetCurObj()已經做了AddRef)

CComPtr pCurObj = g_pPage->GetCurObj();

這裏的初始化直接調了pCurObj的賦值構造函數,裏面又做了次AddRef().

需要修改成
CComPtr pCurObj ;

*(&pCurObj) = g_pPage->GetCurObj();

發佈了134 篇原創文章 · 獲贊 1 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章