从C++调用C#对象,谁应该释放内存

本文关键字:释放 内存 C++ 调用 对象 | 更新日期: 2023-09-27 18:29:12

例如,我有一个带有以下函数的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);

从C++调用C#对象,谁应该释放内存

是的,客户端应该释放内存。在这种情况下,应该使用CoTaskMemFree函数来释放接收到的缓冲区。因为缓冲区可能不会在客户端的堆上分配。CoTaskMemFree将调用适当的deleter。

是的,我认为在调用GetString函数后,您确实需要释放C++代码中的缓冲区。

根据COM"内存管理规则",调用方(C++代码)应该释放作为输出参数返回的内存。在输入/输出参数的情况下,被调用者(CLR和C#代码)可能会释放您传入的参数的内存,然后为输出值分配新的内存,而释放内存同样是调用者的责任。