从 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 对象,谁应该释放内存?的主要内容,如果未能解决你的问题,请参考以下文章

你可以从 C++ 运行 C# 代码吗?

如何从 Excel VBA 释放进程内 COM 服务器对象

从传递回完整对象模型的非托管 C++ 调用 C# 方法

从本机 C++ 调用 C#,而不使用 /clr 或 COM?

VC6的MFC如何调用C#的tlb文件

从 c# 调用 C++ 代码