在调程序是发现下面代码在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();