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

met 发布于 2019-11-10 delphi 最后更新 2019-11-10 12:09 49 浏览

我有这两个功能:

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是否被释放,所以我检查它,如果没有,我将它释放:
procedure TForm1.FormDestroy(Sender: TObject);
begin
 Display.CubRelease;
 if Cub<> NIL
 then FreeAndNil(Cub);
end;
但是,在这一点上,立方体是空的,但不是零。当调用FormDestroy时,程序会给出一个'多任务内存泄漏'的错误。为什么?我已经叫TDiplay.CubRelease。它不应该是无?我得到的消息表明该对象被正确释放,但它不是NIL。 哪个是实施这个的正确方法?
编辑/澄清 多维数据集的所有者无法完全确定,因为Display的父级在释放显示的同时仍然保留多维数据集一段时间。换句话说,在显示器中显示立方体可能是生命周期操作,或者可能只发生一段时间。此外,在某些情况下,我可能根本不显示该立方体。 换句话说,当主窗体关闭时,显示可能存在或可能不存在。 在其他实现中(我只想显示多维数据集的简单查看器),我想让Display来处理多维数据集的销毁,因为我不想保留和额外的对象列表来存储立方体。在这种情况下,显示器基本上就像立方体的存储(所有者)一样。
已邀请:

rut

赞同来自:

内容太长未翻译