COM 组件的内存分配
- W_Z_C
- 共 477 字,阅读约 1 分钟
有时候需要通过一些方法在堆上分配内存缓冲区,并将缓冲区的地址返回给调用者。为此 COM 定义了一组用来在堆上申请释放内存的函数。
- CoTaskMemAlloc 用来分配一块内存。
- CoTaskMemFree 函数用来释放一块使用 CoTaskMemAlloc 分配的内存。
案例如下:
PWSTR pszFilePath;
hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);
if (SUCCEEDED(hr))
{
// ...
CoTaskMemFree(pszFilePath);
}
GetDisplayName 方法用来获取显示名称,函数内部会调用 CoTaskMemAlloc 分配一块内存用来存储,当函数返回的时候,pszFilePath 参数已经指向了一块新的内存区域,所以调用者在函数成功后需要手动调用 CoTaskMemFree 释放函数内部分配的内存。
COM 组件 为什么定义自己的内存分配函数?一个原因是 COM 组件需要提供一个堆分配的抽象层,因为如果不这样做,一些代码中可能会使用 malloc 分配内存,而另一些可能会使用 new 分配内存。相应的,释放内存仍然会有 free 和 delete 两种版本,跟踪这些分配方法显然是不太容易,所以 COM 为了内存分配具有一致性,所以增加了一对内存分配的函数。
另一个重要原因在于 COM 组件是一种二进制标准,它不依赖于任何特定的编程语言,因此内存分配的操作不能和特定的语言绑定。