2016-09-23 20 views
0

В моем драйвере UMDF я есть IWDFMemory упакованы внутри CComPtrОкна УФСТ CComPtr IWDFMemory не получает освобожденный

CComPtr<IWDFMemory> memory; 

Документация CComPtr говорит, Если CComPtr объект выходит из области видимости, он получает автоматически освобождается. Это означает, что этот код не должен создавать никаких утечек памяти:

void main() 
{ 
    CComPtr<IWDFDriver> driver = /*driver*/; 
    /* 
     driver initialisation 
    */ 

    { 
     // new scope starts here 

     CComPtr<IWDFMemory> memory = NULL; 

     driver->CreateWdfMemory(0x1000000, NULL, NULL, &memory); 
     // At this point 16MB memory have been allocated. 
     // I can verify this by the task manager. 

     // scope ends here 
    } 

    // If I understand right the memory I allocated in previous scope should already 
    // be freed at this point. But in the task manager I still can see the 16 MB 
    // memory used by the process. 
} 

Кроме того, если я вручную назначить NULL на memory или позвоните memory.Release() до того объема закончить память не получает свободу. Мне интересно, что здесь происходит?

ответ

1

По MSDN:

Если NULL задается в параметре pParentObject, объект драйвера становится по умолчанию родительский объект для вновь созданного объекта памяти. Если драйвер UMDF создает объект памяти, который использует драйвер с объектом объекта , объектом запроса или другим объектом каркаса, драйвер должен установить родительский объект объекта памяти соответствующим образом. Когда родительский объект удален, объект памяти и его буфер удаляются.

Поскольку вы действительно передаете NULL, память не будет выпущена до тех пор, пока не будет выпущен объект CComPtr<IWDFDriver>.

+0

Итак, что является хорошей практикой для этого примера? Я хочу, чтобы память была освобождена в конце области. Что я должен выбрать в качестве родительского объекта, если не сам драйвер? – arminb

+0

Я не знаком с UMDF, но я посмотрел, как используется «IWDFDriver :: CreateWDFMemory», а в тех местах, где задан непустой владелец, типичным владельцем является объект «IWDFIoRequest». –

 Смежные вопросы

  • Нет связанных вопросов^_^