什么时候适合使用CoTaskMemAlloc?谁能举个例子?
发布于 2008-12-26 13:17:09
天哪,我不得不为此考虑了一段时间--我用ATL做了相当多的小规模COM编程,很少用到它。
然而,有一种情况浮现在我的脑海中:Windows Shell extensions。如果您正在处理一组文件系统对象,则可能必须处理PIDLs (指向ID列表的指针)。这些都是奇怪的小文件系统对象抽象,需要使用支持COM的分配器(如CoTaskMemAlloc )显式地分配/释放它们。还有一种替代方法,即从SHGetMalloc (已弃用)或CoGetMalloc获得的IMalloc接口指针--它只是一个抽象层,这样代码就不会绑定到特定的内存分配器,可以使用任何合适的内存分配器。
使用CoTaskMemAlloc或IMalloc而不是malloc()的要点是,内存分配/释放需要是“COM感知”的,以便在运行时一致地执行内存分配和释放,即使分配和释放是由完全不相关的代码完成的(例如,Windows分配内存,将其转移到稍后释放的C++代码,或者您的C++代码分配,将其转移到其他人的VB代码,后者稍后释放)。malloc()和new都不能与系统的运行时堆互操作,因此您不能使用它们来分配内存以传输到其他COM对象,或者从其他COM对象接收内存并解除分配。
发布于 2011-02-16 01:36:45
将本地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;
}Since .NET uses CoTaskMemFree,你必须像这样分配字符串,你不能使用malloc / new在堆栈或堆上分配它。
发布于 2008-12-26 05:53:47
This MSDN article比较了Win32公开的几个不同的分配器,包括CoTaskMemAlloc。它主要用于COM编程--尤其是当COM服务器的实现需要分配内存才能返回给客户端时。如果您不是在编写COM服务器,那么您可能不需要使用它。
(但是,如果调用使用CoTaskMemAlloc分配内存的代码并将其返回给您,则需要使用CoTaskMemFree释放返回的分配
https://stackoverflow.com/questions/393509
复制相似问题