gpt4 book ai didi

delphi - 什么时候处置 nil 指针是安全的?

转载 作者:行者123 更新时间:2023-12-05 09:00:40 28 4
gpt4 key购买 nike

在下面的例子中:

program DisposeProblem;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils;

type
Person = record
name: string;
age: Integer;
end;

var
p: ^Person;

begin
p := nil;
Dispose(nil); // OK
Dispose(p); // AV
end.

为什么第一个 Dispose() 调用正常,而第二个导致访问冲突错误?当我单步执行代码时,第一个 Dispose() 调用 System._FreeMem(),而第二个调用 System._Dispose(),但我不明白为什么会这样。我想了解此行为,以便知道何时可以安全地调用 nil 指针上的 Dispose()

最佳答案

I would like to understand this behavior so I can know when it is safe to call Dispose() on a nil pointer.

nil 指针变量 上调用Dispose()永远 OK。 RTL 期望变量指向用 New() 分配的有效内存,因此将无条件地 尝试完成指向的任何数据/对象。传入 nil 的指针变量会导致未定义的行为,并且可能会崩溃。

Dispose(nil) 实际上是一个空操作。编译器知道 nil 字面量不可能指向需要最终确定的数据类型,因此它不需要调用 System._Dispose(),因此它改为调用 System._FreeMem()(我不知道为什么它调用任何东西)。

System._FreeMem() 允许 nil 作为输入,它将直接退出而不做任何事情。但是,指针变量 上的 System._Dispose() 不允许将 nil 作为输入(而且从来没有)。

关于delphi - 什么时候处置 nil 指针是安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75214231/

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