我有这两个功能:
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;
但是,此时,立方体为空但不是NIL。调用FormDestroy时,程序会出现“多个空闲内存泄漏”错误。为什么?我已经调用了TDiplay.CubRelease。不应该是NIL吗?我得到的消息表明该对象被正确释放,但它不是NIL。
实现这个的正确方法是什么?
编辑/澄清
无法准确确定多维数据集的所有者,因为Display的父级正在释放显示,同时仍保留多维数据集一段时间。换句话说,在显示器中显示立方体可以是终身操作,或者它可以仅发生一段时间。此外,在某些情况下,我可能根本不显示立方体。
换句话说,当主窗体关闭时,显示器可能存在也可能不存在。
在其他实现中(一个简单的查看器,我想要做的只是显示多维数据集),我想让Display处理多维数据集的破坏,因为我不想保留和额外的对象列表存储立方体。在这种情况下,基本上,显示器就像立方体的存储(所有者)一样。
答案 0 :(得分:8)