为什么此MSDN示例中的指针未被删除?

时间:2015-08-21 13:54:41

标签: c++ pointers directx msdn

我正在查看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;

}

1 个答案:

答案 0 :(得分:3)

IDXGIAdapter最终派生自IUnknown,它是几乎所有与DirectX相关的类的基类(COM接口)。

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

在此特定示例中,指针被插入std::vector并返回此类向量。所以你不能释放它,否则它会成为一个悬垂的指针。