相关疑难解决方法(0)

delphi变量是否默认使用值初始化?

我是Delphi的新手,我一直在运行一些测试来查看默认情况下初始化了哪些对象变量和堆栈变量:

TInstanceVariables = class
  fBoolean: boolean; // always starts off as false
  fInteger: integer; // always starts off as zero
  fObject: TObject; // always starts off as nil
end;
Run Code Online (Sandbox Code Playgroud)

这是我习惯使用其他语言的行为,但我想知道在Delphi中依赖它是否安全?例如,我想知道它是否可能依赖于编译器设置,或者可能在不同的机器上以不同的方式工作.依赖于对象的默认初始化值是正常的,还是在构造函数中显式设置所有实例变量?

至于堆栈(过程级)变量,我的测试显示单位化布尔值为真,单位化整数为2129993264,未初始化对象只是无效指针(即不是nil).我猜测规范是在访问它们之前始终设置过程级变量?

delphi variables initialization

101
推荐指数
9
解决办法
6万
查看次数

在Delphi中初始化哪些变量?

所以我总是听说类字段(基于堆)被初始化,但基于堆栈的变量不是.我还听说记录成员(也是基于堆栈的)也没有初始化.编译器警告局部变量未初始化([DCC警告] W1036变量'x'可能尚未初始化),但不会对记录成员发出警告.所以我决定进行测试.

对于所有记录成员,我总是从Integers得到0而从布尔都得到.

我尝试打开和关闭各种编译器选项(调试,优化等),但没有区别.我的所有记录成员都正在初始化.

我错过了什么?我正在使用Delphi 2009 Update 2.

program TestInitialization;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TR = Record
  Public
    i1, i2, i3, i4, i5: Integer;
    a: array[0..10] of Integer;
    b1, b2, b3, b4, b5: Boolean;
    s: String;
  End;

var
  r: TR;
  x: Integer;

begin
  try
    WriteLn('Testing record. . . .');
    WriteLn('i1 ',R.i1);
    WriteLn('i2 ',R.i2);
    WriteLn('i3 ',R.i3);
    WriteLn('i4 ',R.i4);
    WriteLn('i5 ',R.i5);

    Writeln('S ',R.s);

    Writeln('Booleans: ', R.b1, ' ', R.b2, ' ', R.b3, ' …
Run Code Online (Sandbox Code Playgroud)

delphi variables initialization delphi-2009

32
推荐指数
2
解决办法
8540
查看次数

当我在未初始化的函数结果上调用方法时,为什么不能获得访问冲突?

我的一位同事向我展示了用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.
Run Code Online (Sandbox Code Playgroud)

检查aStrList和Result具有以下结果:

aStrList: TStringList $12FEDC : $42138A


Result: TStringList $12FEC4 : $B01B90 …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe

11
推荐指数
1
解决办法
618
查看次数

结果变量是从函数的第一行定义的吗?

我需要澄清这个案子.

根据我的测试,Result变量定义为:Boolean = False,Integer = 0,String ='',Object = nil等来自第一行.但我从未见过这方面的官方参考.它也有意义,因为这给出了提示.

[DCC警告] Unit1.pas(35):H2077分配给'TForm1.Test'的值从未使用过

function TForm1.Test: Boolean;
begin
  Result := False;
  // Some arbitrary code here

  Result := True;
end;
Run Code Online (Sandbox Code Playgroud)

但是如果我注释掉第一行并且在最后一行之前的某个地方有异常会发生什么?结果=假吗?

如果Result未定义,这意味着我总是必须通过在以后异常的情况下定义Result来启动每个函数.这对我来说毫无意义.

delphi

9
推荐指数
3
解决办法
2639
查看次数

我是否需要在初始化时将setLength设置为动态数组?

type Tmyclass = class(TObject)
  somearray: array of TSometype
  FBool: Boolean;
  Fint: Integer;
  Fstr: string;
  constructor Create;
  destructor Destroy; override;
end;

implementation

constructor Tmyclass.Create;
begin
  inherited;
  SetLength(somearray,0); //is this needed?
end;

destructor TmyClass.Destroy;
begin
  SetLength(somearray,0); //this IS needed!
  inherited;
end;
Run Code Online (Sandbox Code Playgroud)

还有什么类型在创建时初始化?例如我在课堂上宣布的内容.FBool被保证是假的吗?是FInt保证是0吗?是Fstr保证是''?

当地情况怎么样?只有字符串?

我使用Delphi XE.

delphi delphi-xe

3
推荐指数
4
解决办法
5173
查看次数

函数的结果是否始终初始化?

可能重复:
Delphi中Result的默认值是什么

此问题类似,我现在问以下问题.

function Test:Boolean;
begin end;
Run Code Online (Sandbox Code Playgroud)

结果值是否总是保证为假(0)?整数值不是,布尔值也是如此?

delphi types

3
推荐指数
1
解决办法
1930
查看次数