C++ 手动释放ComPtr

C++ 手动释放ComPtr,c++,com,C++,Com,我正在使用ComPtr(Microsoft::WRL)来管理一些DirectX11资源。 如何手动释放它 如果我理解正确,“ReleaseAndGetAddressOf”方法只释放指针,而不是资源本身(返回的),我不确定“Reset”方法 我能想到的唯一替代方法是手动调用指针析构函数,或者在从“ReleaseAndGetAddressOf”获取原始指针后调用“Release”,这是我想要避免的。您可以分配空指针。提供了WRL的源代码,请查看include/winrt/WRL/client.h。嵌

我正在使用ComPtr(Microsoft::WRL)来管理一些DirectX11资源。 如何手动释放它

如果我理解正确,“ReleaseAndGetAddressOf”方法只释放指针,而不是资源本身(返回的),我不确定“Reset”方法


我能想到的唯一替代方法是手动调用指针析构函数,或者在从“ReleaseAndGetAddressOf”获取原始指针后调用“Release”,这是我想要避免的。

您可以分配空指针。

提供了WRL的源代码,请查看include/winrt/WRL/client.h。嵌入的COM指针(ptr_u成员)由InternalRelease()函数释放。使以下任何一种方式释放适合的候选指针:

  • 析构函数。使用ComPtr的原因
  • 分配空ptr
  • 使用ReleaseAndGetAddressOf(),还有很长的路要走
  • 调用Reset()

因此,分配nullptr或调用Reset()是一个很好的选择。或者,如果您只想自己管理接口指针,就不要使用它。当然,不需要使用ComPtr。

谢谢您,就像我希望的那样简单!谢谢你的详细解释。实际上,我从使用智能指针中获益匪浅,但在某些情况下,我必须在维护包装器类的同时卸载内部资源。您对ReleaseAndGetAddressOf()的描述不正确。它确实释放了资源,并返回包装指针的地址,您可以在其中存储另一个指针值。“在那个上面调用Release”应该写为“在现在悬空的指针上调用Release,以使我的程序崩溃”。