【发布时间】:2021-07-18 15:46:17
【问题描述】:
我有这个简单的程序,用 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 离开范围时导致分段错误(end 在myProc1 中遇到)。
我猜这一切都与 Linux 编译器上的自动引用计数有关。
如果我使用FreeAndNil(),程序不会崩溃,但也不会调用析构函数。
什么是优雅的解决方案?
- 在我的程序中有很多类似的
Free。当然,将Free代码转移到其他东西是可能的,但我希望它更优雅。 - 程序需要在 Windows 中编译回 XE2,在 Linux 10.2 上。我读到 10.3 省略了 ARC,这可能会解决问题,但 10.3 的成本很高。
- 需要更改程序,最好尽量减少
{$IFDEF ...}指令。
请告诉我你的建议。
【问题讨论】:
-
将
Destroy()定义(并覆盖)为析构函数,而不是Free()。尽管如此,调用Free()来销毁您的实例是正确的。见this example
标签: linux windows delphi delphi-10.2-tokyo