2010-06-21 41 views
1

我有一个具有MyDataObject类的COM组件。有具有以下签名的方法:COM类在.NET中返回byte [] - 是否释放内存

HRESULT MyDataObject::GetData(long Format, VARIANT* retval) 

这COM对象在.NET应用程序使用,并且该方法返回任一取决于格式值的字符串或字节数组。返回的值在.NET中转换为byte []并使用。

我怀疑这种方法泄漏内存即从这个方法返回的字节数组需要被释放某种方式。当我调试应用程序时,我看到GetData(...)方法调用在每次调用时占用内存。我不知道如何释放这些内存,我可以将它更改为hGlobal,然后调用ReleaseHGlobal(...)或者还有其他方法吗?

修订


是的,我使用任务管理器,看看有多少内存被使用的示例应用程序。当我启动应用程序时,它保持在16MB,但只要我点击测试按钮来调用这个GetData(...)方法大约850次,内存就开始增加,TaskManager显示应用程序的内存使用增加了大约25MB。

回答

1

CLR中的COM互操作层在将其值复制到对象后已释放该变体。即使你想打电话给Marshal.FreeCoTaskMem(),你也不能,你不能得到原始变体的引用。

你没有说你如何断定你有内存泄漏。不要使用Taskmgr.exe,它会给你错误的印象。通过在一个小测试程序中调用这个方法数百万次,确保你已经有了真正的泄漏。如果内存使用量没有增长而最终导致OOM,那么你就没有真正的泄漏。如果它确实崩溃,那么怀疑泄漏的COM服务器。像分配字符串和数组一样,但只返回其中的一个。

+0

我在原帖中增加了一些细节。如果任务管理器给出了错误的印象,那么您是否知道可用于监视应用程序的正确内存使用情况的任何其他工具。另外,当在主应用程序(而不是样本)中调用该方法时,它会在每次操作(即850次调用)之后增加内存(在TaskManager中)。内存似乎没有下降,我猜这意味着它正在被这个COM组件持有。这在内存使用方面给应用程序留下了不好的印象。 – A9S6 2010-06-21 15:27:21

+0

我不知道850电话会做什么。我*确实意味着一百万。 – 2010-06-21 15:33:55

+0

“CLR中的COM互操作层在将它的值复制到对象后已经释放了变体”......您能指出我解释此行为的一些文章吗? – A9S6 2010-06-22 09:46:07