将对象作为参数传递 - 不能是对象

时间:2009-11-16 20:47:36

标签: delphi

我有这两个功能:

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处理多维数据集的破坏,因为我不想保留和额外的对象列表存储立方体。在这种情况下,基本上,显示器就像立方体的存储(所有者)一样。

1 个答案:

答案 0 :(得分:8)

相关问题