有时候需要通过一些方法在堆上分配内存缓冲区,并将缓冲区的地址返回给调用者。为此 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 组件是一种二进制标准,它不依赖于任何特定的编程语言,因此内存分配的操作不能和特定的语言绑定。