代码之家  ›  专栏  ›  技术社区  ›  James Hogle

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

  •  0
  • James Hogle  · 技术社区  · 11 年前

    我在看 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 回复  |  直到 11 年前
        1
  •  3
  •   Banex    11 年前

    IDXGIAdapter 最终来源于 IUnknown ,它是几乎所有DirectX相关类的基类(COM接口)。

    因此,您通常不应致电 delete 在他们身上明确显示。相反,您希望使用COM方法 Release() 它在内部减少对象的引用计数,并在必要时自动删除它。把它看作是一种智能指针。

    在此特定示例中,指针插入到 std::vector 并且返回这样的向量。因此,您不能释放它,否则它将成为一个悬空指针。

    推荐文章