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

原创 2002年11月14日 09:19:00

版本: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的人必须看的东西。

The TeamB guide to avoiding common mistakes in C++Builder. This article contains a list of suggestio...
  • zhngxVPP
  • zhngxVPP
  • 2006年08月16日 21:25
  • 1860

内存泄漏之一,看到的是你想不到的。(C++Builder 6)

最近写一个项目时,发现有内存泄漏,经艰苦奋斗,终于发现一个C++BUILDER 6(已打全部补丁)内存会泄漏的BUG,不敢私藏,写出来供大家参考。这个BUG是由于try {} __finally {}...
  • boyla
  • boyla
  • 2008年02月13日 22:32
  • 1189

Indy10 for C++ builder 6 编译笔记

1、在$(BCB)目录下创建一个名为indy10C6/Source的目录; 2、下载indy.zip,改名为indy-10-2004-06-09.zip,将indy-10-2004-06-09.zip...
  • yunin
  • yunin
  • 2004年06月26日 15:03
  • 5762

在 C++Builder 2006 中使用 Indy10 控件!

首先,这是个 C++ Builder 2006 的 BUG!C++Builder 的大部份控件均从 Delphi 的 .pas 而来。从 .Pas 编译生成的 .hpp 会丢失部分 struct 信息...
  • sczyq
  • sczyq
  • 2006年04月14日 16:03
  • 2861

C++ Builder VCL的字符串函数(2)

原文地址:http://www.yesky.com/20020701/1618451_1.shtml1. UpperCase  将指定的AnsiString字符串转换为大写形式,函数原型如下:  An...
  • extcsdn
  • extcsdn
  • 2005年08月08日 18:00
  • 1592

Indy9 安装到C++Builder6 (本人验证通过)

1)移除 BCB6 中原本的 Indy   (1.1)放入原本安裝 BCB6 的光碟片,選擇「C++ Builder 6」   (1.2)在 Borland C++ Builder 6 Enterpr...
  • proton
  • proton
  • 2004年12月29日 20:07
  • 1099

将C++ Builder6 的Indy 升级到 9.0

第一步:下载Indy 9要正确安全Indy 9的最新版本,必须下载两个版本的源代码。 下载Indy 9.0.0.17 版源代码 下载Indy 9.0.0.18 版...
  • whchen
  • whchen
  • 2006年09月28日 08:55
  • 3866

C++Builder中如何应用消息(转)

标准的BCB程序使用Application->Run()进入消息循环,在Application的ProcessMessage方法中,使用PeekMessage方法从消息队列中提取消息,并将此消息从消息...
  • weixing979
  • weixing979
  • 2004年07月11日 23:20
  • 3952

VCL 中的一个内存泄漏 Bug

  • zgqtxwd
  • zgqtxwd
  • 2008年04月30日 15:11
  • 97

C++ builder package(bcb bpl)创建和vcl调用

之前分享了创建DLL动态库的过程,
  • lushangqiushui
  • lushangqiushui
  • 2014年04月06日 20:22
  • 1395
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ Builder 5 和 6中VCL的一个内存泄漏 BUG
举报原因:
原因补充:

(最多只允许输入30个字)