【问题标题】:Where to put the destructor code for an ATL COM object?将 ATL COM 对象的析构函数代码放在哪里?
【发布时间】:2012-03-08 00:32:42
【问题描述】:

我在 ATL COM 对象中定义的东西的析构代码属于哪里?

应该进入~MyComClass()还是MyComClass::FinalRelease()

【问题讨论】:

    标签: c++ com destructor atl


    【解决方案1】:

    这是一般方法:

    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 有关。

    【讨论】:

    • 比你。 ATL 向导没有在我的类中添加::Release() 方法,但大概这个引用计数正在某个地方进行?我怎样才能找到它?
    • @SideshowBob,抱歉,我从未使用过 ATL 向导,因此无法评论它的作用。鉴于他的回答,Roman R. 似乎对此很熟悉。
    • ATL 通常使用new CComObject<T>,它继承自T,并在最派生类中添加了AddRefRelease 的实现——这样,delete this; 与非虚拟析构函数。
    • 当您使用 ATL 时,您永远不应该手动实现 Release()。正如 Simon Richter 所写,它由 CComObject 实现。
    【解决方案2】:

    只要有问题FinalRelease,我认为您的问题与 ATL 有关。

    在大多数情况下,您可以在两者中的任何一个中进行清理。 FinalRelease 将在实际析构函数之前立即调用。重要的区别在于,如果您聚合其他对象,FinalRelease 让您有机会在顶级 COM 对象类的实际析构函数(尤其是CComObject)开始工作之前清理引用并释放依赖项。

    也就是说,您分两步清理内容,首先引用 FinalRelease 中的聚合对象,然后是 FinalRelease 或析构函数中的其他内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-01
      • 2014-11-21
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      相关资源
      最近更新 更多