Windows COM C++ - 使用删除或释放

Windows COM C++ - Using delete or Release

本文关键字:删除 释放 COM C++ Windows      更新时间:2023-10-16

我想问的快速问题,我有一个 Direct2D 工厂,当我准备清理时,我会调用删除还是使用发布成员?我看到一些教程只是显式调用 delete,所以我很好奇哪个更安全,除非发布成员所做的只是在后台调用 delete 等。

Graphics::~Graphics() {
    if (Factory) //Factory->Release(); or  delete Factory;
    if (Render) //Render->Release();  or delete Render;
}

释放 COM 接口的正确方法是在接口指针上调用 Release 方法。

delete 用于在堆上分配new C++对象,而不是 COM 接口指针。

请注意,您还可以使用智能指针类(如 ATL 的 CComPtr)安全地包装原始 COM 接口指针。在这种情况下,当智能指针超出范围时,将自动调用 Release 方法。

例如,如果对示例中的FactoryRender数据成员使用智能指针包装器,则无需在Graphics析构函数中显式调用Release:C++编译器将自动调用每个数据成员上的析构函数,这将导致为包装的 COM 接口调用Release

当然Release();,而且只有这个接口方法。 并且您只能对以前由自己的new分配的内存调用delete。 总是错误调用从外部DLL分配的内存delete,因为它们 new/delete 无法匹配您的 new/delete