C++ Builder 5 和 6中VCL的一个内存泄漏 BUG (转)

本文介绍了一个存在于C++Builder5和6中VCL的内存泄漏问题,主要涉及utilcls.h文件中的几个操作符实现。通过创建包含BSTR参数事件的comServer程序可复现此问题。文章提供了修改建议并指出了可能需要重新编译VCL库。
C++ Builder 5 和 6中VCL的一个内存泄漏 BUG (转)[@more@]

版本:C++Builder 5 、6

文件:{C++Builder Path}/include/vcl/utilcls.h
行号:1039 (implemention of operator AnsiString() const)
行号:1065 (implemention of operator WideString() const)
行号:1081 (implemention of operator wchar_t*() const)
  在上面三个操作符的实现里,变量v分配的资源(字符串)没有被释放,因为v是TBaseVariantT的变量,而TBaseVariantT只有constructor没有destructor,所以v在constructor中分配的内存就丢失了。

  通过简单的实验程序可以检测出来,写一个包含事件的com Server程序,并且事件接口函数中包含BSTR类型的参数,注册后,在C++ Builder中用import type library引入,并且生成包装类的component。然后建立一个简单的程序,把包装类的component放到程序的form上,并且实现component的事件函数(可以是空代码,但必须有这个函数)。比如:

void __fastcall MainForm::MyServerEvent1(BSTR msg)

{

// empty code

}

在自动生成的包装类中,C++ Builder利用自动化接口调用每个事件函数,从源文件中可以看到调用MyServerEvent1的代码类似如下:

if( OnMyServerEvent1 )

  OnMyServerEvent1( TVariant(params[0])  );

在这个语句中隐式的调用了operator wchar_t*() const,因此内存泄漏发生了。让Server触发事件足够多的次数,内存泄漏就很明显的表现出来,可以一直耗光系统内存。

解决办法很简单,稍微改动代码即可,别忘了先删除lib目录下的预编译头文件vcl60.csm(vcl50.csm),否则改动的代码不会重编译。

虽然不确定,但是很可能需要重编译VCL的库,因为VCL中的代码中可能也有调用上面操作符的地方。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-993788/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-993788/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值