在調程序是發現下面代碼在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();