【发布时间】:2010-12-17 05:11:39
【问题描述】:
我有这两个功能:
procedure TDisplay.CubAssign(VAR Obj: TCubObj; CONST bReleaseOnExit: boolean);
begin
ReleaseCubOnExit:= bReleaseOnExit;
FCub:= Obj;
if CubReady
then
begin
Init;
SetScrollBar;
end
else Clear;
end;
procedure TDisplay.CubRelease;
begin
if FCub<> NIL
then
TRY
FreeAndNil(FCub);
EXCEPT
MesajErrDetail('CubRelease', 'Cannot free object');
END
else FCub:= NIL;
Clear;
end;
我将我的 TDisplay 放在一个表单上,然后通过 CubAssign 创建一个 Cube 对象并将其分配给 TDisplay。后来我通过调用 TDisplay.CubRelease 释放了那个 Cube。现在,当我关闭表单时,我不知道我的 Cube 是否被释放,所以我检查它,如果不是 NIL,我释放它:
procedure TForm1.FormDestroy(Sender: TObject);
begin
Display.CubRelease;
if Cub<> NIL
then FreeAndNil(Cub);
end;
但是,此时 Cube 是空的,但不是 NIL。当调用 FormDestroy 时,程序会给出“Multi Free memory leak”错误。为什么?我已经调用了 TDiplay.CubRelease。不应该是零吗?我收到的消息表明该对象已正确释放,但它不是 NIL。
什么是正确的实现方式?
编辑/澄清
无法准确确定 Cube 的所有者,因为 Display 的父级在释放 Display 的同时仍保留 Cube 一段时间。换言之,在显示器中显示立方体可能是终身操作,也可能只发生一段时间。此外,在某些情况下,我可能根本不显示立方体。
换句话说,当主窗体关闭时,显示可能存在也可能不存在。
在其他实现中(一个简单的查看器,我只想显示立方体),我想让 Display 处理立方体的销毁,因为我不想保留额外的对象列表存储多维数据集。在这种情况下,基本上,显示器就像立方体的存储(所有者)一样。
【问题讨论】:
-
与 fCub 相比,Cub 是什么?
-
Cub显然是表单的字段或属性,而FCub是显示对象的字段。我个人永远不会将 cube 缩写为 cub。柏拉图式固体不应与小熊混淆。 -
“与 fCub 相比,Cub 是什么?” ----> 变量持有相同类型的对象。 Cub 在 TForm1 中声明和创建。 FCub 已声明但未在 TDisplay 中创建。在 CubAssign 中,我分配 FCub:= Cub,所以它们本质上是一回事
-
不,Altar,它们不是一回事。显然,这是您问题的关键。
-
对不起,我把这个放在了不好的地方。我绝对知道它们是 2 个不同的变量(因为我分别声明了它们)。我想说它们指向同一个对象——更准确地说是同一个内存地址。
标签: delphi