EhLib的内存泄漏

本文探讨了EhLib在初始化过程中存在的问题,包括未实现的UnRegister功能导致的异常错误,以及由此引发的内存泄漏问题。通过对RegisterDatasetFeaturesEh函数的分析与修改,成功解决了上述问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EhLibADO,

 

initialization
  RegisterDatasetFeaturesEh(TADOSQLDatasetFeaturesEh, TADOQuery);
  RegisterDatasetFeaturesEh(TADOCommandTextDatasetFeaturesEh, TCustomADODataSet);

 

EhLibCDS

initialization
{$IFDEF EH_LIB_6}
  RegisterDatasetFeaturesEh(TCDSDatasetFeaturesEh, TCustomClientDataSet);
{$ELSE}
  RegisterDatasetFeaturesEh(TCDSDatasetFeaturesEh, TClientDataSet);
{$ENDIF}

 

居然没有UnRegisterData……看来EhLib团队也有菜鸟

移植到DLL中,退出EXE报AV错误,原因是这里没有UnRegister

 

修改后用FastMM4发现有内存泄漏

查看RegisterDatasetFeaturesEh发现

procedure RegisterDatasetFeaturesEh(DatasetFeaturesClass: TDatasetFeaturesEhClass;
  DataSetClass: TDataSetClass);
var
  DatasetFeatures: TDatasetFeaturesEh;
  ClassIndex: Integer;
begin
  DatasetFeatures := DatasetFeaturesClass.Create;
  DatasetFeatures.FDataSetClass := DataSetClass;
  if DatasetFeatures.FDataSetClass = nil then
    Exit;   //既然等Nil,何必要去创建(DatasetFeatures)……
  ClassIndex := DatasetFeaturesList.IndexOf(DatasetFeatures.FDataSetClass.ClassName);
  if ClassIndex >= 0
    then DatasetFeaturesList.Objects[ClassIndex] := DatasetFeatures    //如果已经有了之前那个对象怎么办……
    else DatasetFeaturesList.AddObject(DatasetFeatures.FDataSetClass.ClassName,
            DatasetFeatures);
end;

 

//还好提供源码。修正后,没有问题了

转载于:https://www.cnblogs.com/DKSoft/archive/2011/04/25/2027304.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值