我正在查看this MSDN article,其中讨论了如何通过计算机上的图形适配器进行枚举。在下面的代码示例中,我注意到IDXGIAdapter * pAdapter
永远不会被明确删除。我的业余C ++大脑将此视为内存泄漏。有没有理由不删除它?
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;
}
答案 0 :(得分:3)
IDXGIAdapter
最终派生自IUnknown
,它是几乎所有与DirectX相关的类的基类(COM接口)。
因此,您通常不应该明确地对它们调用delete
。相反,您希望使用COM方法Release()
,它在内部递减对象的引用计数,并在必要时自动删除它。把它想象成一种智能指针。
在此特定示例中,指针被插入std::vector
并返回此类向量。所以你不能释放它,否则它会成为一个悬垂的指针。