为什么这个 MSDN 示例中的指针没有被删除?
Why is the pointer in this MSDN example not deleted?
我在看 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;
}
IDXGIAdapter
最终派生自 IUnknown
,它是几乎所有与 DirectX 相关的 class 的基础 class(COM 接口)。
因此,您通常不应明确地对它们调用 delete
。相反,您想使用 COM 方法 Release()
,它在内部减少对象的引用计数,并在必要时自动删除它。将其视为一种智能指针。
在这个具体的例子中,指针被插入到一个std::vector
中并返回这样一个向量。所以一定不能释放,否则会变成悬空指针。
我在看 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;
}
IDXGIAdapter
最终派生自 IUnknown
,它是几乎所有与 DirectX 相关的 class 的基础 class(COM 接口)。
因此,您通常不应明确地对它们调用 delete
。相反,您想使用 COM 方法 Release()
,它在内部减少对象的引用计数,并在必要时自动删除它。将其视为一种智能指针。
在这个具体的例子中,指针被插入到一个std::vector
中并返回这样一个向量。所以一定不能释放,否则会变成悬空指针。