繁体   English   中英

Delphi演员:内存泄漏?

[英]Delphi Cast: Memory leak?

在Delphi中,我正在从已经创建的基类中继承一个继承的类。 我相信它共享两个类之间的基类地址,但是继承的类的额外成员获得了分配给它们的额外内存,但是没有初始化。

如果然后释放共享基类,这是否会导致Inherited的类成员的内存泄漏?

如果是这样,如果我想保持基类保持不变,那么清理继承类成员的最佳方法是什么?

program Project1;

uses
  SysUtils;

type
   TBase = class(TObject)
   public
     basemember : string ;
     Constructor Create() ;
   end;

   TInherited = class(TBase)
   public
     inheritedmember : string ;
     Constructor Create() ;
   end ;

   Constructor TBase.Create() ;
   begin
       basemember := 'Basemember' ;
       Writeln ('basemember') ;
   end ;

   Constructor TInherited.Create() ;
   begin
       inheritedmember := 'inheritedmember' ;
       Writeln ('inheritedmember') ;
   end ;

var
     baseclass      : TBase;
     castbaseclass  : TInherited;
begin

  Writeln ('Base Class');
  baseclass := TBase.Create();

  Writeln ('');
  Writeln ('Cast Inherited Class');
  castbaseclass := TInherited(baseclass);

  baseclass.Free; //memory leak?
  ReadLn;

end.

这里没有内存泄漏,但是演员阵容仍然是错误的。

您担心这行代码:

castbaseclass := TInherited(baseclass);

自从Delphi类是引用类型, baseclasscastbaseclass都是指针。 你在这里所做的一切都被分配了一个指针变量。 您从未随后引用castbaseclass 如果你这样做了,那么就有可能出现运行时错误,因为编译器认为castbaseclass是一个TInherited实例,但实际上它是一个不太专业的类TBase的实例。

但是,你有一个非常深刻的误解。

我正在从已经创建的基类中继承一个继承的类。 我相信它共享两个类之间的基类地址,但是继承的类的额外成员获得了分配给它们的额外内存,但是没有初始化。

没有! 绝对不。 为了实例化TInherited实例,您必须调用TInherited的构造TInherited 你不能创建一个类的实例,并期望它变成另一个类。 实例的类型在创建时一劳永逸地确定。 实例的内存在创建实例时分配,而不是在其他时间分配。

所以,如果你想要一个TInherited ,请创建一个。 如果你想要TBase ,请创建一个。 但是您无法创建TBase并将其类型更改为TInherited 你可以做的是创建一个TInherited然后将它分配给TBase类型的变量。 这是因为TInherited来自TBase

所以你可以写:

var
  base: TBase;
  inherited_: TInherited; // _ because inherited is a keyword
....
inherited_ := TInherited.Create;
base := inherited_;

但你不能写:

var
  base: TBase;
  inherited_: TInherited;
....
base := TBase.Create;
inherited_ := base;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM