COM 中的内存分配

有时,方法在堆上分配内存缓冲区,并将缓冲区的地址返回给调用方。 COM 定义了一对函数,用于分配和释放堆上的内存。

我们在 “打开”对话框示例中看到了此模式的示例:

PWSTR pszFilePath;
hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);
if (SUCCEEDED(hr))
{
    // ...
    CoTaskMemFree(pszFilePath);
}

GetDisplayName 方法为字符串分配内存。 在内部, 方法调用 CoTaskMemAlloc 来分配字符串。 当方法返回时, pszFilePath 指向新缓冲区的内存位置。 调用方负责调用 CoTaskMemFree 以释放内存。

为什么 COM 定义自己的内存分配函数? 原因之一是在堆分配器上提供抽象层。 否则,某些方法可能会调用 malloc ,而其他方法则调用 new。 然后,在某些情况下,程序需要调用 free ,并在其他情况下 删除 ,并且跟踪这一切很快就会变得不可能。 COM 分配函数创建统一方法。

另一个考虑因素是 COM 是 二进制 标准,因此它不绑定到特定的编程语言。 因此,COM 不能依赖任何特定于语言的内存分配形式。

下一步

COM 编码做法