0

如果有一个对象(在我的情况下是 TJSONData)并且我想释放这个对象,程序流有时会挂在这个位置。我的代码中已经有如下构造,但有时它似乎不适合这种情况:

if Assigned(MyRecord.MyJSONData) then
begin
  MyRecord.MyJSONData.Free;
end;

如果我尝试释放一个对象两次,我可以在测试中重现这种行为。在我的程序中,这通常不应该发生,但现在我真正的问题是:

有没有办法检查对象是否已经空闲?还是我还需要使用 FreeAndNil();?

4

2 回答 2

6

Assigned 函数检查引用是否不为 nil。如果不是 nil 则返回 True,如果 nil 则返回 False。

显然,当您释放对象并且未将引用设置为 nil 时,它将通过下一次分配的检查(引用 <> nil)并再次尝试释放。但是引用(指针)已经悬空(指向释放或更糟,更改的内存)。

通常,您应该将引用设置为nil或更好 - 使用 FreeAndNil 函数。这样,每次您想要访问已释放的对象时,它将为零,这就是您的检查。

于 2012-07-19T11:06:32.870 回答
-1

Delphi 论坛上有一个关于 FreeAndNil 的大线程(最终压垮了论坛)。

共同点是,对于 95% 的任务,您不应该检查对象是否处于活动状态,您应该事先知道它并构建程序,以便您始终知道并且永远不需要这些检查。

一些幸存或恢复的链接位于http://www.theregister.co.uk/2012/01/16/verity_stob_sons_of_khan_2011/print.htmlhttps://forums.embarcadero.com/message.jspa?messageID=413796

于 2012-07-19T11:48:01.587 回答