【问题标题】:Does Release call on an Interface ensure that the COM Component is distroyed接口上的 Release 调用是否确保 COM 组件被销毁
【发布时间】:2014-04-21 19:15:37
【问题描述】:

我正在处理一个问题,我看到客户站点发生间歇性崩溃,在代码审查时,我发现我们已经在析构函数中编写了一些代码来释放内存等,但我的问题是什么时候会破坏- 或被调用。

当客户端调用接口上的 Release 时是否会调用它。或者我们如何释放接口消耗的资源,或者我们应该何时释放这些资源。

我知道当对 Relase 的调用返回“0”时,COM 调用 DllcanGetUnloadNow 并且 dll 被卸载,那么释放内存呢?

谁能解释一下

问候 汤姆

【问题讨论】:

标签: c++ visual-c++ com


【解决方案1】:

如果引用计数达到零,通常会从Release 调用实现对象的析构函数。这是由实现对象的Release 实现所执行的。

所以,Release 的典型实现如下所示:

IFACEMETHODIMP_(ULONG) Release()
{
    ULONG cRef = InterlockedDecrement(&_cRef);

    if (!cRef)
        delete this;
    return cRef;
}

【讨论】:

    【解决方案2】:

    正确使用 COM 需要通过引用计数管理对象生命周期的某些法律。

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms692481(v=vs.85).aspx

    不遵循此规则的单个代码足以导致崩溃。

    【讨论】:

      【解决方案3】:

      COM 接口的使用者无法控制 COM 类/对象的销毁。消费者的责任是在需要释放接口指针时准确调用IUnknown::Release。虽然返回的零通常表示对象的“最后释放和销毁”,但此值 is informational and does not guarantee object destruction。当不存在对对象的外部引用时,COM 对象有责任进行适当的释放。

      其余的销毁是 COM 对象实现的责任。一旦它检测到它是由持有引用的每个人释放的,它通常会在最简单的情况下进行自毁。但是,它不必完全是这种方式。对象可能有一些后台活动来延长生命周期,有单例和缓存对象,其中有一定的逻辑来保持对象存活等。

      因此,解决破坏问题分为正确的接口引用计数 (AddRef/Release) 和检查 COM 服务器以在没有消费者的情况下正确关闭活动(包括释放内存和资源)。

      【讨论】:

        猜你喜欢
        • 2014-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-23
        • 1970-01-01
        • 2019-01-28
        • 2019-12-04
        • 2021-04-19
        相关资源
        最近更新 更多