gpt4 book ai didi

delphi - 对已释放对象的错误引用

转载 作者:行者123 更新时间:2023-12-03 14:57:44 25 4
gpt4 key购买 nike

有没有办法确保我们持有对对象的可用引用,即确保它尚未被释放而使非零引用悬空。

最佳答案

如果您使用 FastMM4 作为内存管理器,您可以检查该类是否不是 TFreeObject
或者,在更标准的情况下,使用一个例程,通过检查类 VMT 来验证您的对象是否如其所言。

此类 ValidateObj 函数已经存在了一段时间(由 Ray Lischner 和 Hallvard Vassbotn 编写:http://hallvards.blogspot.com/2004/06/hack-6checking-for-valid-object.html)

这是另一个:

function ValidateObj(Obj: TObject): Pointer;
// see { Virtual method table entries } in System.pas
begin
Result := Obj;
if Assigned(Result) then
try
if Pointer(PPointer(Obj)^) <> Pointer(Pointer(Cardinal(PPointer(Obj)^) + Cardinal(vmtSelfPtr))^) then
// object not valid anymore
Result := nil;
except
Result := nil;
end;
end;

更新:有点小心...上面的函数将确保结果为 nil 或有效的非 nil 对象。如果内存管理器已经重新分配了之前释放的内存,它不能保证 Obj 仍然是您所认为的那样。

关于delphi - 对已释放对象的错误引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/113504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com