gpt4 book ai didi

c++ - 当指针超出范围时,CComObject::CreateInstance 创建的 COM 对象不会被销毁

转载 作者:可可西里 更新时间:2023-11-01 18:29:25 27 4
gpt4 key购买 nike

使用智能指针 CComObject 我通过调用其静态方法 CreateInstance 创建了一个 COM 对象。但是当我离开我的程序时,至少在 VS13 中,那个对象仍然在运行。这是我的代码:

CComObject< CMyAtlObject > * myAtlCOMObject = NULL;
HRESULT hr = CComObject< CMyAtlObject >::CreateInstance(&myAtlCOMObject);
ASSERT(SUCCEEDED(hr));

我希望在超出范围时调用 ~CComObject() 方法,但这并没有发生。

我尝试将上面的代码放在花括号中以强制新创建的对象超出范围。我尝试在 myAtlCOMObject 上调用 FinalRelease 并成功地在 myAtlCOMObject 上手动调用 Release,但程序仍然没有停止在 VS13 中运行。

我错过了什么?

最佳答案

这是带有内联注释的代码:

{
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

What am I missing?

您缺少以下内容:

  • CreateInstance 创建一个新对象并获取原始指针,该指针不会在离开范围时自毁
  • CreateInstance 创建一个引用计数为零的处于“不稳定”状态的对象,它在引用管理上的自销毁在某些东西至少递增引用计数然后将其递减为零之后开始;上面的CComQIPtr就是一个例子

MSDN on CreateInstance :

The object returned has a reference count of zero, so call AddRef immediately, then use Release to free the reference on the object pointer when you're done.

你用什么代替 CComObject::CreateInstance

我有一个 helper template class CObjectPtr它的行为方式类似于众所周知的 CComPtr 并包装/管理 native 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? .

关于c++ - 当指针超出范围时,CComObject::CreateInstance 创建的 COM 对象不会被销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25608183/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com