【发布时间】:2019-01-23 21:25:34
【问题描述】:
- 我创建了一个对象
- 我将它作为参数传递给了其他地方。在其他地方释放我无法控制的对象。
- 在编码结束时,我尝试检查对象是否有效,然后将其销毁。 Assigned() 方法返回true(似乎是因为存储对象引用地址的变量)。但是,引用的对象已经被销毁,我遇到了异常。
我的问题是,我如何检查一个对象是否已经被销毁? 除了 Assigned() 之外,还有什么可以检查该对象是否仍然存在?
program Project1;
uses System.SysUtils;
type TObj = class
public
Name: string;
end;
var AnObj, AnObj2 : TObj;
begin
try
try
AnObj := TObj.Create;
AnObj.Name := 'Testing';
AnObj2 := AnObj; // AnObj passed to other procedures as param
FreeAndNil(AnObj2); // somewhere else "Free" the object out of my control
// as a result, AnObj is still assigned but the object is destroyed
finally
if Assigned(AnObj) then // AnObj is assigned, HOW COULD I IMPROVE HERE?
FreeAndNil(AnObj); // Exception: Invalid pointer operation
end;
except
on E:Exception do
writeln(E.Message);
end;
readln;
end.
【问题讨论】:
-
感谢您提供此信息,是的,它是重复的。
-
这很简单:你不能。释放的指针看起来与有效指针完全一样。必须检查是您的程序逻辑应该防止的事情。如果您对此有疑问,请阅读 Dalija Prasnikar 关于内存管理的书。
-
存在某种重复,但公认的答案给出了糟糕的建议,正如前 Delphi 架构师 Danny Thorpe 在他的评论中所显示的那样。 FreeAndNil 不能代替适当的内存管理。 FreeAndNil 通常是一种代码味道。
标签: delphi