【发布时间】:2021-11-01 12:26:44
【问题描述】:
我只有在托管 linux 服务器时才遇到访问冲突。 Windows 没有显示任何问题。当我尝试 FreeandNilChild Object if OWner 时会发生这种情况,请参阅代码。错误以图片形式附上。为什么这只发生在 Linux 服务器上?我是否遗漏了一些内存处理不当..可能是 GBD 版本..? Thakns 伙计们表示赞赏。 TWAObject = 类(TObject)
destructor TBasePersoneel.Destroy;
begin
FreeAndNilChild(FUser);
Inherited;
end;
然后
procedure TWAObject.FreeAndNilChild(var obj);
Var
T : TWAObject;
begin
T:=TWAObject(Obj);
if Assigned(T) and (T.Owner=Self) then
FreeAndNil(T);
end;
还得到 RunError(216) 然后是 EAccessViolation。 过程 FreeAndNil(var obj);来自 sysinth.inc
【问题讨论】:
-
查看汇编代码,变量
FUser包含一个无效值,既不代表nil,也不代表有效对象。也许在 Windows 下,该变量是nil或具有巧合指向内存中某个有效地址的无效值。 -
这段代码闻起来像双重免费等待发生。您应该寻找销毁对象的其他地方。我们这里看不到。你会通过调试找到它。调试程序始终是一个不错的选择。
-
谢谢马丁。你认为有没有办法检查这个“无效值”的if语句,正如你所说的那样,它没有指向内存中的有效地址?谢谢
-
感谢大卫,这就是我所怀疑的,但在我们的项目中找不到释放它的任何地方。
-
在类析构函数中加入一个日志语句。这就是我所说的调试的意思。
标签: linux pascal freepascal lazarus