如何正确释放一个COM所占用的内存?等您救命!!!(200分)

  • 主题发起人 主题发起人 ncuwk
  • 开始时间 开始时间
N

ncuwk

Unregistered / Unconfirmed
GUEST, unregistred user!
我是用的MSXML 4.0
在C++ Builder中导入的。
问题是随着运行,内存不断的被消耗,
但退出程序是内存也正确释放了。
我想使我在多线程中为正确释放该COM对象所占用的内存造成的,
使用了多个该COM对象的实例。
请问如何在程序不退出的情况下正确释放COM对象呢?
要释放的最干净的做法。
谢谢!
BOW!
 
CoUninitialize?
 
CoUninitialize试过了,好像无效。
我是在多线程的环境中使用了同一种COM的不同实例。
怎么释放最彻底?
 
从delphi 中文技巧集转载的,你看看对你有没有启发

COM中分配内存的注意事项
我发现DELPHI的内存分配和释放函数GetMem和FreeMem最好不要在COM组件的编写过程中使用否则可能会产生错误.
事情的经历是这样的,由于工作需要,要将一个VC写的DLL用DELPHI封装成为COM组件,在COM中我需要分配一些内存然后传给VC写的这个DLL由他款充后然后再由我使用.就是这样一个过程,在使用内存的时候我使用的是GetMem和FreeMem来进行的,程序开始运行的时候没有问题,可是当一个操作连续跳几次之后问题就来了,灾难性错误,这种错误虽然在COM组件的编写过程中常见,但是也绝对是令人头痛的事情.于是我开始找错.
最初我怀疑错误是VC DLL填写我分配的内存区所造成的,可是后来经过查找后这种可能性被排除.这时我就已经感觉到可能是由DELPHI中的内存分配函数与COM组件兼容性不好,所造成的这个问题,但是又一时没有其它的函数替换.
万般无奈之下向HUBDOG请教,被告之,在COM中分配内存最好使用IMalloc接口来实现我就象是得到了救命稻草一样,马上在程序中试了一下,果然如此.看来问题的确是由DELPHI的内存分配函数所造成的.
补充说明一点:出错的代码段是使用GetMem分配了1.4K左右的内存,而只分配了几百字节的代码段则没有事情.
来自:Hongjiang, 时间:2001-4-9 22:39:30, ID:497062
不同的开发环境分配内存的方式是不一样的,COM是基于二进制的对象重用方式,为了能够在不同的环境中使用COM组件,COM对内存的分配和释放是有要求的,即要通过IMalloc接口来分配和释放内存(IMalloc::Alloc, IMalloc::Free),或者调用CoTaskMemAlloc, oTaskMemFree。同时,COM对内存的分配和释放的职责也是有规定的,对于[in]参数,内存应该由Client分配和释放,对于[out]参数,内存由Server分配,但是由Client释放,对于[in,out]参数,内存可以在Client端分配,在Server端可以被释放,然后再分配,最后在Client端释放。
COM其实对一个熟悉C++的程序员来说并不是很困难,仔细研究一下从类重用方式转化到二进制重用的方式所碰到的问题,就会明白COM为什么会是这样的,而且本质上来说,COM和Class没有多少区别。

 
一般好象是用release吧
 
后退
顶部