Windows UMDF CComPtr IWDFMemory不会被释放

时间:2016-09-23 12:40:44

标签: memory-leaks com driver msdn umdf

在我的UMDF驱动程序中,IWDFMemory

内有CComPtr
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 个答案:

答案 0 :(得分:1)

根据MSDN

  

如果在pParentObject参数中指定了NULL,则为驱动程序对象   成为新创建的内存对象的默认父对象。   如果UMDF驱动程序创建驱动程序使用的内存对象   特定的设备对象,请求对象或其他框架对象,   driver应该适当地设置内存对象的父对象。   删除父对象时,内存对象及其缓冲区   被删除。

由于确实传递了NULL,因此在释放CComPtr<IWDFDriver>对象之前不会释放内存。