为什么这个 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中并返回这样一个向量。所以一定不能释放,否则会变成悬空指针。