C++ Builder 5 和 6中VCL的一个内存泄漏 BUG
2002-11-14 09:19
447 查看
版本: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中的代码中可能也有调用上面操作符的地方。
文件:{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中的代码中可能也有调用上面操作符的地方。
相关文章推荐
- ISA Server 的故障排除工具(2)
- C++算法系列之日历生成的算法代码
- VC与Delphi之间动态链接库互相调用
- ATL实现Connection Point的一种简单的方法
- 输入输出流为什么要用缓冲区?
- 力争最简单把*、&说清楚
- 移植到 Windows 2000 和 COM+
- 用VB和MTS开发多层数据库应用系统
- 使用C#开发COM+组件
- 利用pre-compiled headers技术以加速编译速度--以Borland C++ Builder为例(四)
- 利用pre-compiled headers技术以加速编译速度--以Borland C++ Builder为例(二)
- 利用pre-compiled headers技术以加速编译速度--以Borland C++ Builder为例(一)
- 利用pre-compiled headers技术以加速编译速度--以Borland C++ Builder为例(五)
- 让应用程序禁止Windows屏幕保护
- 一种新颖的技术:Delphi for DOS!!!
- InstallShield简明使用教程
- boost::iterator_adaptor (III)
- boost::any
- ”红色警戒“肆虐台湾
- 注释与反注释Comment/Uncomment selected code in Visual C++