什么时候适合使用CoTaskMemAlloc?有人能举个例子吗?
将char*从本机C++库返回到.NET时,使用CoTaskMemAlloc作为字符串.
C#
[DllImport("test.dll", CharSet=CharSet.Ansi)] extern static string Foo();
C
char* Foo() { std::string response("response"); int len = response.length() + 1; char* buff = (char*) CoTaskMemAlloc(len); strcpy_s(buff, len, response.c_str()); return buff; }
由于.NET使用CoTaskMemFree,您必须像这样分配字符串,不能使用malloc/new在堆栈或堆上分配它.
天哪,我不得不考虑一下这个 - 我用ATL完成了相当数量的小规模COM编程,很少用它.
有一种情况可以想到:Windows Shell扩展.如果您正在处理一组文件系统对象,则可能必须处理PIDL(指向ID列表的指针).这些是奇怪的小文件系统对象抽象,需要使用COM感知分配器显式分配/解除分配CoTaskMemAlloc
.还有一个替代方法,IMalloc
接口指针SHGetMalloc
(不建议使用)或CoGetMalloc
- 它只是一个要使用的抽象层,因此您的代码不依赖于特定的内存分配器,可以使用任何适当的代码.
使用CoTaskMemAlloc
或者IMalloc
更确切地说malloc()
,内存分配/释放需要是"COM-aware",以便在运行时一致地执行其分配和释放,即使分配和释放完全不相关也是如此.代码(例如,Windows分配内存,将其传输到您的C++代码,后来解除分配,或者您的C++代码分配,将其转移到其他人的VB代码,后来取消分配).既malloc()
不能也不能new
与系统的运行时堆进行互操作,因此您无法使用它们来分配内存以传输到其他COM对象,或者从其他COM对象接收内存并取消分配.
这篇MSDN文章比较了Win32公开的各种分配器,包括CoTaskMemAlloc.它主要用于COM编程 - 最具体的是当COM服务器的实现需要分配内存以返回给客户端时.如果您没有编写COM服务器,那么您可能不需要使用它.
(但是,如果调用使用CoTaskMemAlloc分配内存的代码并将其返回给您,则需要使用CoTaskMemFree释放返回的分配.)