gpt4 book ai didi

linux - Linux中简单的Delphi程序中的段错误-Windows很好

转载 作者:行者123 更新时间:2023-12-04 16:24:21 27 4
gpt4 key购买 nike

我有一个简单的程序,用 Delphi 10.2 编写,在 Windows 上运行良好,但在 Linux 上崩溃。

本质是使用的类在其析构函数中具有要执行的代码。

type
Kwak = class
public
index: integer;
constructor Create(index:integer);
destructor Free;
end;

constructor Kwak.Create(index:integer);
begin
self.index := index;
writeln('Welcome Kwak '+inttostr(index));
end;

destructor Kwak.Free;
begin
writeln('Bye Kwak '+inttostr(index));
end;

如果我在调用过程中使用它,比如这个:

procedure myProc1;
var
myKwak:Kwak;
begin
myKwak := Kwak.Create(15);
myKwak.Free;
end;

这在 Windows 上运行良好,但在 Linux 上导致 myKwak 离开范围时出现段错误(在 myProc1 中遇到 end) .

我猜这一切都与 Linux 编译器上的自动引用计数有关。

如果我使用 FreeAndNil(),程序不会崩溃,但也不会调用析构函数。

什么是优雅的解决方案?

  • 在我的程序中有很多类似的Free。当然,将 Free 代码转移到其他东西是可能的,但我希望它更优雅。
  • 程序需要在 Windows 中编译回 XE2,在 Linux 10.2 上。我读到 10.3 省略了 ARC,这可能会解决问题,但 10.3 的成本很高。
  • 需要更改程序,最好尽量减少 {$IFDEF ...} 指令。

请告诉我你的建议。

最佳答案

destructor Free; // <-- WRONG!

这是错误的。正确的析构函数被称为 Destroy() ,它是 TObject 中的 virtual 所以你需要 override 它在派生类中:

type 
Kwak = class
public
index: integer;
constructor Create(index:integer);
destructor Destroy; override;
end;

constructor Kwak.Create(index:integer);
begin
inherited Create;
self.index := index;
writeln('Welcome Kwak '+inttostr(index));
end;

destructor Kwak.Destroy;
begin
writeln('Bye Kwak '+inttostr(index));
inherited;
end;

在非 ARC 系统上,TObject.Free() 是一个非虚拟实例方法,如果 Self 则调用 Destroy() 析构函数> 不是 nil

在 ARC 系统上,编译器默默地用 nil 赋值替换所有对 Free() 的调用,从而减少对象的引用计数。这样就可以在 ARC 和非 ARC 系统上使用具有相似语义的相同代码。对象的 Destroy() 析构函数在其引用计数降至 0 时被调用。

关于linux - Linux中简单的Delphi程序中的段错误-Windows很好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68430706/

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