Я смотрел this MSDN article, который рассказывает о том, как перечислить графические адаптеры на компьютере. В следующем примере кода я заметил, что IDXGIAdapter * pAdapter
никогда не удаляется явно. Мой любительский мозг C++ видит это как утечку памяти. Есть ли причина, по которой это не будет удалено?Почему указатель в этом примере MSDN не удаляется?
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;
}
Обычно вы не хотите явно удалять объекты, наследуемые из 'IUnknown', поскольку большинство объектов DirectX. Вместо этого вызовите 'Release()' на них. В этом конкретном случае вы даже не должны выпускать его, потому что он хранится в векторе и используется впоследствии. – Banex
Как правило, вы должны соответствовать методу распределения и методу освобождения. Поэтому 'new []' соответствует 'delete []', а не 'delete', есть пара' malloc/free', а COM имеет собственную пару «AddRef/Release». – MSalters