从 C++ 调用 C# com 对象,谁应该释放内存?
Posted
技术标签:
【中文标题】从 C++ 调用 C# com 对象,谁应该释放内存?【英文标题】:Calling C# com object from c++, who should free the memory? 【发布时间】:2012-03-26 14:38:33 【问题描述】:例如。我有具有此类功能的 c# COM 对象:
int GetString([In, Out, MarshalAs(UnmanagedType.LPStr)]ref string str)
然后我从 c++ 调用 int(在 c++ 中 COM 对象通过 #import
关键字使用),在生成的包装方法中声明为:
GetString(LPSTR * str, long * retVal)
我这样称呼它:
char myStr[40];
LPSTR buf = (LPSTR)myStr;
LPSTR pBuf = &buf;
pComObject->GetString(pBuf);
有什么奇怪的:
1) myStr 未填充,buf
值已更改(调用后与myStr
不同)所以,我认为 c# marshaller 分配了新的内存块
2) 如果 c# 分配内存,我应该调用free(buf);
吗?
【问题讨论】:
【参考方案1】:是的,客户端应该释放内存。 在这种情况下,应该使用CoTaskMemFree 函数来释放接收到的缓冲区。由于缓冲区可能未在客户端的堆上分配。 CoTaskMemFree 将调用适当的删除器。
【讨论】:
【参考方案2】:是的,我认为您确实需要在调用 GetString 函数后释放 C++ 代码中的缓冲区。
根据COM "Memory Management Rules",调用者(您的C++ 代码)应该释放作为输出参数返回的内存。在输入/输出参数的情况下,被调用者(CLR 和您的 C# 代码)可能会释放您传入的参数的内存,然后为输出值分配新的内存,调用者再次负责释放那段记忆。
【讨论】:
点赞!很好的解释,我应该提到规则。以上是关于从 C++ 调用 C# com 对象,谁应该释放内存?的主要内容,如果未能解决你的问题,请参考以下文章