我有一个具有MyDataObject类的COM组件。有一种方法具有以下签名:
HRESULT MyDataObject::GetData(long Format, VARIANT* retval)
此COM对象用于.NET应用程序,该方法根据Format值返回字符串或字节数组。返回的值在.NET中转换为byte []并使用。
我怀疑这种方法是在泄漏内存,即从这种方法返回的字节数组需要以某种方式释放。当我调试应用程序时,我看到GetData(...)方法调用在每次调用时占用内存。我不知道如何释放这段记忆,我可以将其更改为hGlobal,然后调用ReleaseHGlobal(...)还是有其他方法吗?
更新的的
<小时/> 是的,我正在使用任务管理器来查看示例应用程序正在使用多少内存。当我启动应用程序时,它保持在16MB但是当我按下测试按钮调用此GetData(...)方法大约850次时,内存开始增加,TaskManager显示应用程序的内存使用量增加了大约25MB。
答案 0 :(得分:1)
CLR中的COM互操作层在将其值复制到对象后已经释放了该变量。即使您想要调用Marshal.FreeCoTaskMem()也不能,您也无法获得对原始变体的引用。
你没有说你是如何断定你有内存泄漏的。不要使用Taskmgr.exe,它会给你错误的印象。通过在小型测试程序中调用此方法数百万次,确保您有真正的泄漏。如果内存使用量没有限制地增长并最终导致OOM,那么您没有真正的泄漏。如果它确实崩溃,那么怀疑COM服务器的泄漏。就像分配字符串和数组一样,但只返回其中一个。