如果有一个对象(在我的情况下是TJSONData)并且我想释放这个对象,程序流有时会挂起在这个位置。我的代码中已经有了类似下面的结构,但有时似乎不适合这种情况:
if Assigned(MyRecord.MyJSONData) then
begin
MyRecord.MyJSONData.Free;
end;
如果我尝试释放对象两次,我可以在测试中重现此行为。在我的程序中,这通常不会发生,但现在是我真正的问题:
有没有办法检查对象是否已经空闲?或者我还需要使用FreeAndNil();?
答案 0 :(得分:6)
Assigned函数检查引用是否不是。它 如果不是nil则返回True,如果为nil则返回False。
显然,当您释放该对象并且未将引用设置为nil时,它将传递下一个Assigned check(引用<> nil)并将尝试再次释放。但是引用(指针)已经悬空(指向释放或更糟,更改,内存)。
通常您应该将引用设置为 nil 或更好 - 使用FreeAndNil函数。这样,每次你想要访问被释放的对象时,它都是零,这就是你的检查。
答案 1 :(得分:-1)
在Delphi论坛(最终粉碎论坛)中有一个关于FreeAndNil的大线程。
常见的一点是,对于95%的任务,你不应该检查如果一个对象还活着,你应该事先知道并构建程序以便你总是知道并且永远不需要那些检查。
一些幸存或复活的链接位于http://www.theregister.co.uk/2012/01/16/verity_stob_sons_of_khan_2011/print.html和https://forums.embarcadero.com/message.jspa?messageID=413796