加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 调用TObjectList.Clear时,不会释放TObjectList中的对

发布时间:2020-12-15 09:49:26 所属栏目:大数据 来源:网络整理
导读:请参阅下面的代码.为了简单起见,我删除了很多代码,但剩下的代码仍然很长,对不起:( IObserver = interface ['{1DD212F8-BD5E-47BF-9A3B-39EF7B9D99B5}'] procedure Update(Observable: IObservable); end; TObserver = class abstract (TSingletonImplementat
请参阅下面的代码.为了简单起见,我删除了很多代码,但剩下的代码仍然很长,对不起:(

IObserver = interface
    ['{1DD212F8-BD5E-47BF-9A3B-39EF7B9D99B5}']
    procedure Update(Observable: IObservable);
  end;

  TObserver = class abstract (TSingletonImplementation,IObserver)
    strict protected
      //...
    public
      constructor Create;
      destructor Destroy; virtual;
      //IObserver
      procedure Update(Observable: IObservable); virtual; abstract;
      //... 
  end;

  TShapeModification = class abstract (TObserver)
    strict protected
      //...
    public
      //Doesn't have a constructor
  end;

  TRangePointModification = class(TShapeModification)
    strict private
      //...
    public
      constructor Create(...);
      //...
  end;

  constructor TRangePointModification.Create(...);
  begin
    inherited Create;
    //...
  end;

然后在某个时候:

TClientClass = class
  strict private
    fList: TObjectList<TShapeModification>;
  public
    constructor Create();
    destructor Destroy(); override;
    procedure Add(ShapeModification: TShapeModification);
end;

constructor TClientClass.Create;
begin
  Self.fList:=TObjectList<TShapeModification>.Create(true);
end;

destructor TClientClass.Destroy;
begin
  Self.fList.Clear;
  FreeAndNil(Self.fList);
end;

最后,在某些时候:

var
  MyClient: TClientClass;
begin
  MyClient:=TClientClass.Create();
  MyClient.Add(TRangePointModification.Create());
  MyClient.Free;
end;

当释放MyClient时,调用TClientClass析构函数然后应该清除内部fList,但不调用TRangePointModification(来自TObserver)的析构函数.为什么不?

(我使用的是Delphi 10.2 Tokyo)

解决方法

查看警告 – 编译器会告诉您错误:

W1010 Method 'Destroy' hides virtual method of base type ...

总是在你的析构函数上放置覆盖(不是虚拟的!) – 否则对Free的调用将不会执行你放入它们的代码.

所以作为基本建议:

>总是编写产生零警告或提示的代码 – 它们很可能指向您迟早会遇到的缺陷>在您怀疑存在缺陷的代码中加入一个断点 – 即使忽略了编译器警告,您也会看到对Clear的调用从未进行过

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读