【发布时间】:2012-03-08 00:32:42
【问题描述】:
我在 ATL COM 对象中定义的东西的析构代码属于哪里?
应该进入~MyComClass()还是MyComClass::FinalRelease()?
【问题讨论】:
标签: c++ com destructor atl
我在 ATL COM 对象中定义的东西的析构代码属于哪里?
应该进入~MyComClass()还是MyComClass::FinalRelease()?
【问题讨论】:
标签: c++ com destructor atl
这是一般方法:
MyComClass::~MyComClass()
{
// Cleanup object resources in here.
}
ULONG __stdcall MyComClass::Release()
{
ref_count_--;
if (0 == ref_count_)
{
delete this;
return 0;
}
return ref_count_;
}
编辑:FinalRelease() 似乎与我不熟悉的 ATL 有关。
【讨论】:
::Release() 方法,但大概这个引用计数正在某个地方进行?我怎样才能找到它?
new CComObject<T>,它继承自T,并在最派生类中添加了AddRef 和Release 的实现——这样,delete this; 与非虚拟析构函数。
只要有问题FinalRelease,我认为您的问题与 ATL 有关。
在大多数情况下,您可以在两者中的任何一个中进行清理。 FinalRelease 将在实际析构函数之前立即调用。重要的区别在于,如果您聚合其他对象,FinalRelease 让您有机会在顶级 COM 对象类的实际析构函数(尤其是CComObject)开始工作之前清理引用并释放依赖项。
也就是说,您分两步清理内容,首先引用 FinalRelease 中的聚合对象,然后是 FinalRelease 或析构函数中的其他内容。
【讨论】: