C++ 是->;对COM对象的析构函数调用Release()?

C++ 是->;对COM对象的析构函数调用Release()?,c++,visual-c++,com,directx,C++,Visual C++,Com,Directx,如果我有以下资料: ID3D11Buffer **buffers; //ID3D11Buffer is a com object buffers=new ID3D11Buffer* [num]; 如果我这样做:每个ID3D11Buffer*的Release()方法是自动调用的,还是我必须自己调用它们?Alldelete[]buffers将释放包含COM对象指针的数组。您确实需要在数组中循环并手动执行Release()。对数组调用delete,将销毁数组中的每个元素。但是,由于每个元素都是一

如果我有以下资料:

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

如果我这样做:每个
ID3D11Buffer*
Release()
方法是自动调用的,还是我必须自己调用它们?

All
delete[]buffers将释放包含COM对象指针的数组。您确实需要在数组中循环并手动执行
Release()

对数组调用
delete
,将销毁数组中的每个元素。但是,由于每个元素都是一个POD哑指针,所以破坏它并没有任何作用。如果要自动释放COM对象,应使用智能指针,如或。

Ok,如果我执行类似删除缓冲区[0]的操作,则会调用Release吗?否,先生。所要做的就是过早地释放属于COM对象的内存。就像下面所说的,因为指针只是哑指针,它们不会自动调用
Release()
或进行任何其他清理那么你所有的终身管理问题都将消失。同意,但根据我的经验,
com\ptr\t
在各个方面都优于ATL智能指针。更轻量级,而不是ATL运行时依赖,异常抛出错误语义。+1,还有
std::vector
CComPtr
\u com\u ptr\t
的合适容器@Remus Rusanu,我从来没有研究过com智能指针之间的差异,事实上我忘了不止一个。我会听从你的意见,更新我的答案。
delete[] buffers;