我有一个简单的程序,使用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 ...}
指令。
请告诉我您的建议。
Destroy()
定义为析构函数并覆盖它,而不是使用Free()
。调用Free()
来销毁实例仍然是正确的。请参见此示例。 - AmigoJack