gpt4 book ai didi

delphi - 当我对未初始化的函数结果调用方法时,为什么不会出现访问冲突?

转载 作者:行者123 更新时间:2023-12-03 14:40:34 26 4
gpt4 key购买 nike

我的一位同事向我展示了用 Delphi-XE XE 版本 15.0.3953.35171 编写的代码,我认为它应该会引发访问冲突。代码如下:

unit Unit3;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm3 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
function test:TstringList;
{ Public declarations }
end;

var
Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.FormCreate(Sender: TObject);
var aStrList : TStringList;
begin
aStrList := TStringList.Create;
test;
FreeAndNil(aStrList);
end;

function TForm3.test: TstringList;
var i:Integer;
begin
for i:=0 to 1000 do
Result.Add('aaa');//AV?
end;

end.

检查 aStrList 和 Result 得到以下结果:

aStrList: TStringList $12FEDC : $42138A


Result: TStringList $12FEC4 : $B01B90

我不明白它为什么起作用。 Result.Add 应该引发访问冲突

LE:似乎仅适用于调试构建配置。

最佳答案

该函数中的 Result 变量尚未初始化,可以保存任何值。现在,实现细节意味着,在某些编译器选项组合中,您的代码恰好在 Result 引用有效对象的情况下运行。但这实际上只是这些实现细节的巧合。

如果这是 C++,那么该函数将表现出未定义的行为。尽管该术语在 Delphi 中没有正式含义,但在 Delphi 设置中使用该术语与 C++ 上下文中的含义相同会很有帮助。

我还要指出,即使 Result 没有引用有效的字符串列表对象,您的代码也不能保证引发访问冲突。 Result 可能指向一 block 内存块,而该内存块恰好看起来足够像字符串列表,以便该代码能够成功执行。

如果你做得正确,你就可以预测程序的行为。如果您的代码有缺陷并导致未定义的行为,那么您的程序的行为将变得不可预测。它可能会起作用。它可能会失败。或者该代码可能执行得很好,但随后会在程序执行后期导致失败。等等。

关于delphi - 当我对未初始化的函数结果调用方法时,为什么不会出现访问冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13475523/

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