首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我在一个未初始化的函数结果上调用方法时,为什么我没有得到访问冲突?

当我在一个未初始化的函数结果上调用方法时,为什么我没有得到访问冲突?
EN

Stack Overflow用户
提问于 2012-11-20 22:38:28
回答 1查看 694关注 0票数 11

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

代码语言:javascript
复制
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的结果如下:

代码语言:javascript
复制
aStrList: TStringList $12FEDC : $42138A


Result: TStringList $12FEC4 : $B01B90

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

LE:它似乎只在Debug Build配置上起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-21 03:30:08

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

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

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

如果你做得很好,你可以预测你的程序的行为。如果你的代码有缺陷并导致未定义的行为,那么你的程序的行为就会变得不可预测。这也许能行得通。它可能会失败。或者,代码可能执行得很好,但随后会导致程序执行失败。诸若此类。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13475523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档