2015-08-21 4 views
0

Я смотрел 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; 

} 
+5

Обычно вы не хотите явно удалять объекты, наследуемые из 'IUnknown', поскольку большинство объектов DirectX. Вместо этого вызовите 'Release()' на них. В этом конкретном случае вы даже не должны выпускать его, потому что он хранится в векторе и используется впоследствии. – Banex

+1

Как правило, вы должны соответствовать методу распределения и методу освобождения. Поэтому 'new []' соответствует 'delete []', а не 'delete', есть пара' malloc/free', а COM имеет собственную пару «AddRef/Release». – MSalters

ответ

3

IDXGIAdapter в конечном счете происходит от IUnknown, который является базовым классом (COM-интерфейс) практически любого DirectX связанных с классом.

Как таковой, вы должны, как правило, не называть delete на них явно. Вместо этого вы хотите использовать метод COM Release(), который внутренне уменьшает счетчик ссылок объекта и автоматически удаляет его, если это необходимо. Подумайте об этом как о каком-то умном указателе.

В этом конкретном примере указатель вставляется в std::vector, и такой вектор возвращается. Поэтому вы не должны выпускать его, иначе он станет висящим указателем.

+0

Лучшее решение здесь - использовать '' std :: vector > '' –