【问题标题】:(EAccessViolation) : Access violation while FreeAndNilChild from Owner (LINUX) LAZARUS PASCAL(EAccessViolation) : 来自所有者 (LINUX) LAZARUS PASCAL 的 FreeAndNilChild 访问冲突
【发布时间】: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


【解决方案1】:

感谢您的反馈,原来我释放了两次相同的对象。出于某种原因,在 Windows 中,分配给了正确的内存指针。但在 Linux 中没有。谢谢各位

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    相关资源
    最近更新 更多