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

C++ 为什么此MSDN示例中的指针未被删除?,c++,pointers,directx,msdn,C++,Pointers,Directx,Msdn,我在看关于如何通过计算机上的图形适配器进行枚举的讨论。在下面的代码示例中,我注意到,IDXGIAdapter*pAdapter从未被显式删除。我的业余C++大脑把这看作是一个内存泄漏。是否有理由不删除此项 std::vector <IDXGIAdapter*> EnumerateAdapters(void) { IDXGIAdapter * pAdapter; std::vector <IDXGIAdapter*> vAdapters; IDX

我在看关于如何通过计算机上的图形适配器进行枚举的讨论。在下面的代码示例中,我注意到,
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;

}
std::向量枚举适配器(void)
{
IDXGIAdapter*pAdapter;
std::矢量可变适配器;
IDXGIFactory*pFactory=NULL;
//创建DXGIFactory对象。
if(失败(CreateDXGIFactory(uu uuidof(IDXGIFactory),(void**)和pFactory)))
{
回流阀;
}
对于(UINT i=0;
pFactory->EnumAdapters(i和pAdapter)!=DXGI\u未找到错误;
++(一)
{
vAdapters。推回(pAdapter);
} 
if(工厂)
{
pFactory->Release();
}
回流阀;
}

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

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


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

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

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


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

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

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


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

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

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


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

您通常不希望明确删除从
IUnknown
继承的任何对象,因为大多数DirectX对象都是这样。对它们调用
Release()
。在这种特殊情况下,您甚至不应该释放它,因为它存储在一个向量中,并在之后使用。作为一般规则,您必须匹配分配方法和解除分配方法。因此
new[]
匹配
delete[]
,而不是
delete
,有一对
malloc/free
,COM有自己的
AddRef/Release
对。通常,您不想像大多数DirectX对象那样,明确删除从
IUnknown
继承的任何对象。对它们调用
Release()
。在这种特殊情况下,您甚至不应该释放它,因为它存储在一个向量中,并在之后使用。作为一般规则,您必须匹配分配方法和解除分配方法。因此
new[]
匹配
delete[]
,而不是
delete
,有一对
malloc/free
,COM有自己的
AddRef/Release
对。通常,您不想像大多数DirectX对象那样,明确删除从
IUnknown
继承的任何对象。对它们调用
Release()
。在这种特殊情况下,您甚至不应该释放它,因为它存储在一个向量中,并在之后使用。作为一般规则,您必须匹配分配方法和解除分配方法。因此
new[]
匹配
delete[]
,而不是
delete
,有一对
malloc/free
,COM有自己的
AddRef/Release
对。通常,您不想像大多数DirectX对象那样,明确删除从
IUnknown
继承的任何对象。对它们调用
Release()
。在这种特殊情况下,您甚至不应该释放它,因为它存储在一个向量中,并在之后使用。作为一般规则,您必须匹配分配方法和解除分配方法。因此
new[]
匹配
delete[]
,而不是
delete
,有一对
malloc/free
和COM有自己的
AddRef/Release
对。这里更好的解决方案是使用
std::vector
这里更好的解决方案是使用
std::vector
这里更好的解决方案是使用
std::vector