C++ 接口上的释放调用是否确保COM组件已分发

C++ 接口上的释放调用是否确保COM组件已分发,c++,visual-c++,com,C++,Visual C++,Com,我正在处理一个问题,我看到客户站点上发生了间歇性崩溃,而代码检查时,我发现我们已经在析构函数中编写了一些代码来释放内存等。但我的问题是,这个析构函数什么时候发生或被调用 当客户端调用接口上的释放时,是否会调用它。或者我们如何释放一个接口所消耗的资源,或者我们应该在什么时候释放这些资源 我知道当Relase调用返回“0”时,COM调用DllcanGetUnloadNow并卸载dll,那么释放内存呢 有人能澄清一下吗 问候 tom通常,如果引用计数已达到零,则从Release调用实现对象的析构函数。

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

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

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

有人能澄清一下吗

问候
tom

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

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

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

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

正确使用COM需要遵循有关通过引用计数管理对象生存期的某些规则


一段不遵循此规则的代码就足以导致崩溃。

COM接口的使用者无法控制COM类/对象的销毁。一旦需要释放接口指针,消费者的责任是准确地调用
IUnknown::Release
。虽然返回的零通常表示对象的“上次释放和销毁”,但该值为。当不存在对对象的外部引用时,COM对象负责执行适当的释放

其余的销毁工作由COM对象实现负责。一旦它检测到它是由持有引用的每个人发布的,它通常会在最简单的场景中进行自我销毁。然而,它并不一定是这样。对象可能有一些后台活动来延长生命周期,有一些单例对象和缓存对象,它们有一定的逻辑来保持对象的活动状态,等等


因此,销毁故障排除分为正确的接口引用计数(AddRef/Release)和检查COM服务器,以便在没有使用者的情况下正确关闭活动(包括释放内存和资源)。

另请参阅感谢大家的回复