在我的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()
,则内存不会被释放。我想知道这里发生了什么?
答案 0 :(得分:1)
根据MSDN:
如果在pParentObject参数中指定了NULL,则为驱动程序对象 成为新创建的内存对象的默认父对象。 如果UMDF驱动程序创建驱动程序使用的内存对象 特定的设备对象,请求对象或其他框架对象, driver应该适当地设置内存对象的父对象。 删除父对象时,内存对象及其缓冲区 被删除。
由于确实传递了NULL,因此在释放CComPtr<IWDFDriver>
对象之前不会释放内存。