使用智能指针CComObject
我通过调用静态方法CreateInstance
来创建COM对象。但是当我离开我的程序时,至少在VS13中,该对象仍在运行。这是我的代码:
CComObject< CMyAtlObject > * myAtlCOMObject = NULL;
HRESULT hr = CComObject< CMyAtlObject >::CreateInstance(&myAtlCOMObject);
ASSERT(SUCCEEDED(hr));
我希望在超出范围时调用~CComObject()
方法,而不会发生。
我尝试将上面的代码放在花括号中,以强制新创建的对象超出范围。
我尝试在FinalRelease
上拨打myAtlCOMObject
并成功在Release
上手动呼叫myAtlCOMObject
,但程序仍然没有停止在VS13中运行。
我错过了什么?
答案 0 :(得分:8)
以下是带内联注释的代码:
{
CComObject<CMyAtlObject>* myAtlCOMObject = NULL;
HRESULT hr = CComObject< CMyAtlObject >::CreateInstance(&myAtlCOMObject);
ASSERT(SUCCEEDED(hr));
// NOTE: Created new object with reference count of ZERO
{
const CComQIPtr<IMyAtlObject> pMyAtlObject = myAtlCOMObject;
// NOTE: Reference count increased to ONE
}
// NOTE: ~CComQIPtr went out of scope and called IUnknown::Release
// decrementing counter to ZERO; decrement to zero causes destruction
}
// NOTE: There is no ~CComObject call here on myAtlCOMObject going out of scope
// since myAtlCOMObject is a raw pointer
我错过了什么?
您缺少以下内容:
CreateInstance
创建一个新对象并获取原始指针,该指针在离开范围时不会自行销毁CreateInstance
在&#34;不稳定&#34;中创建一个对象在引用计数为零的状态下,它在引用管理的自我抽取开始之后,在某个增量重新计数至少一个然后将其减少到零;上面CComQIPtr
就是这个返回的对象的引用计数为零,因此请立即调用AddRef,然后在完成后使用Release释放对象指针的引用。
CComObject::CreateInstance
?我有一个helper template class CObjectPtr
,其作用类似于众所周知的CComPtr
,并包装/管理本机C ++类。
我的代码是:
CObjectPtr<CFoo> pFoo;
pFoo.Construct(); // Instantiates automatically adding reference
CFoo* pRawFoo = pFoo; // Acts as a pointer
CComPtr<IFoo> pFooInterface = pFoo; // Good for exposing inmepleted interafaces
CObjectPtr<CFoo> pAnotherFoo = pFoo; // Same instance proper reference counting
// ~CObjectPtr releases reference, destroys the object on last release
此答案中还提供了另一个简单的包装器:How to better initialize a reference counter for a non-creatable COM object?。