我在看 this MSDN article 它讲述了如何通过计算机上的图形适配器进行枚举。在下面的代码示例中,我注意到 IDXGIAdapter * pAdapter 从未明确删除。我的业余C++大脑将此视为内存泄漏。是否有原因不将其删除?
IDXGIAdapter * pAdapter
std::vector <IDXGIAdapter*> EnumerateAdapters(void) { IDXGIAdapter * pAdapter; std::vector <IDXGIAdapter*> vAdapters; IDXGIFactory* pFactory = NULL; // Create a DXGIFactory object. if(FAILED(CreateDXGIFactory(__uuidof(IDXGIFactory) ,(void**)&pFactory))) { return vAdapters; } for ( UINT i = 0; pFactory->EnumAdapters(i, &pAdapter) != DXGI_ERROR_NOT_FOUND; ++i ) { vAdapters.push_back(pAdapter); } if(pFactory) { pFactory->Release(); } return vAdapters; }
IDXGIAdapter 最终来源于 IUnknown ,它是几乎所有DirectX相关类的基类(COM接口)。
IDXGIAdapter
IUnknown
因此,您通常不应致电 delete 在他们身上明确显示。相反,您希望使用COM方法 Release() 它在内部减少对象的引用计数,并在必要时自动删除它。把它看作是一种智能指针。
delete
Release()
在此特定示例中,指针插入到 std::vector 并且返回这样的向量。因此,您不能释放它,否则它将成为一个悬空指针。
std::vector