【问题标题】:is ->Release() called on the destructor of COM objects?是在 COM 对象的析构函数上调用 ->Release() 吗?
【发布时间】:2010-12-23 23:44:37
【问题描述】:

如果我有以下情况:

ID3D11Buffer **buffers;    //ID3D11Buffer is a com object
buffers=new ID3D11Buffer* [num];

如果我这样做:

delete[] buffers;
每个ID3D11Buffer*Release()方法会被自动调用,还是我必须自己调用?

【问题讨论】:

  • 以 'std::vector> > 缓冲区开始;'那么你所有的终身管理问题都会消失。

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


【解决方案1】:

在数组上调用delete 将破坏数组的每个元素。但是由于每个元素都是一个 POD 哑指针,因此破坏它不会做任何事情。如果希望 COM 对象自动释放,则应使用智能指针,例如 _com_ptr_tCComPtr

【讨论】:

  • 同意,但根据我的经验,com_ptr_t 在各个方面都优于 ATL 智能指针。 msdn.microsoft.com/en-us/library/417w8b3b%28VS.80%29.aspx更轻量级,不依赖ATL运行时,错误的异常抛出语义。
  • +1,std::vector 也是CComPtr_com_ptr_t 的合适容器。
  • @Remus Rusanu,我从未研究过 COM 智能指针之间的差异,实际上我忘记了不止一个。我会听从您的意见并更新我的答案。
【解决方案2】:

delete[] buffers; 所做的只是释放包含指向 COM 对象的指针的数组。您确实需要手动循环遍历数组和Release()

【讨论】:

  • 好的,如果我执行 delete buffers[0] 之类的操作,是否会调用 Release?
  • 不,先生。所要做的就是过早地释放属于 COM 对象的内存。就像下面的Mark Ransom 所说的那样,因为指针就是这样——哑指针,它们不会自动调用Release() 或进行任何其他清理。
猜你喜欢
  • 2014-10-25
  • 2020-04-29
  • 2016-01-23
  • 2011-11-29
  • 2018-08-14
  • 2020-09-25
  • 1970-01-01
  • 2011-11-01
  • 2014-10-24
相关资源
最近更新 更多