为什么这个MSDN示例中的指针没有被删除?

Why is the pointer in this MSDN example not deleted?

本文关键字:指针 删除 MSDN 为什么      更新时间:2023-10-16

我正在看一篇MSDN文章,它讨论了如何通过计算机上的图形适配器进行枚举。在下面的代码示例中,我注意到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相关的类的基类(COM接口)。

因此,通常不应该显式地对它们调用delete。相反,您希望使用COM方法Release(),该方法在内部减少对象的引用计数,并在必要时自动删除它。把它想象成一种智能指针。

在这个具体的例子中,指针被插入到一个std::vector容器中,并返回一个这样的向量。所以你不能释放它,否则它会变成一个悬空指针。