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