从C++调用C#对象,谁应该释放内存
Calling C# com object from c++, who should free the memory?
例如,我有一个带有以下函数的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);
?
是的,客户端应该释放内存。在这种情况下,应该使用CoTaskMemFree函数来释放接收到的缓冲区。因为缓冲区可能不会在客户端的堆上分配。CoTaskMemFree将调用适当的deleter。
是的,我认为在调用GetString函数后,您确实需要释放C++代码中的缓冲区。
根据COM"内存管理规则",调用方(C++代码)应该释放作为输出参数返回的内存。在输入/输出参数的情况下,被调用者(CLR和C#代码)可能会释放您传入的参数的内存,然后为输出值分配新的内存,而释放内存同样是调用者的责任。
相关文章:
- 如何在c++中释放内存
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 释放内存(主题模板)时出现问题
- 使用后自动释放内存
- C++ 如何释放内存
- 从函数内对象的向量中释放内存
- C++ 在不释放内存的情况下调用析构函数
- 多个线程之间的获取-释放内存顺序
- C++ - 析构函数只是释放内存还是实际删除对象
- 使用 RAII 替换最终块以释放内存
- 如何通过带有指向基类的指针的删除运算符释放内存
- 代码中的"sprintf"用法是否需要释放内存?
- C++何时使用 delete[] 并正确释放内存?
- 为什么此获取和释放内存围栏不能给出一致的值?
- 抛出新表达式的参数子表达式时释放内存
- 在这种情况下,如何释放内存?
- 在 c++ 中应按什么顺序释放内存?