- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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类是引用类型,baseclass
和castbaseclass
都是指针。您在这里所做的一切都被分配了一个指针变量。您随后永远不会引用 castbaseclass
。如果你这样做了,那么可能会出现运行时错误,因为编译器认为 castbaseclass
是一个 TInherited
实例,但实际上它是一个不太专业的实例类,TBase
。
但是,你的误解很深。
I'm casting an inherited class from a base class which is already created. I believe this shares the base class addresses between the two classes, but the inherited's class's extra members get extra memory allocated to them, but are not initialised.
不!绝对不。为了实例化 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;
关于德尔福 Actor : Memory leak?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31298362/
我是一名优秀的程序员,十分优秀!