挂在SomeObject.Free上.检查FPC中的对象是否已免费?

Max*_*uta 0 delphi free hang fpc

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

if Assigned(MyRecord.MyJSONData) then
begin
  MyRecord.MyJSONData.Free;
end;
Run Code Online (Sandbox Code Playgroud)

如果我尝试释放对象两次,我可以在测试中重现此行为.在我的程序中,这通常不会发生,但现在我真正的问题:

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

Kro*_*ica 6

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

显然,当你释放对象并且没有设置对nil的引用时,它将传递下一个Assigned check(reference <> nil),并且将尝试再次释放.但是引用(指针)已经悬空(指向释放或更糟,更改,内存).

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