快速问题我想问一下,我有一个Direct2D工厂,当我准备清理时,我会调用删除或使用发布会员吗?我看到一些教程只是明确地调用delete,所以我很好奇哪个更安全,除非所有发布成员都在后台调用delete等。
Graphics::~Graphics() {
if (Factory) //Factory->Release(); or delete Factory;
if (Render) //Render->Release(); or delete Render;
}
答案 0 :(得分:4)
释放COM接口的正确方法是在接口指针上调用Release
方法。
delete
适用于在堆上使用new
分配的C ++对象,而不适用于COM接口指针。
请注意,您还可以使用智能指针类(如ATL的CComPtr
)安全地包装原始COM接口指针。在这种情况下,当智能指针超出范围时,Release
方法会自动调用 。
例如,如果您在示例中为Factory
和Render
数据成员使用智能指针包装器,则无需在Release
析构函数中显式调用Graphics
:C ++编译器将自动调用每个数据成员上的析构函数,这将导致为包装的COM接口调用Release
。
答案 1 :(得分:0)
当然是Release();
,只有这个在接口方法上。并且您只能为您之前由自己delete
分配的内存调用new
。对于从外部delete
分配的内存,始终会出现错误调用DLL
,因为他们的新/删除内容与您的新/删除不匹配