相关疑难解决方法(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 7析构函数中释放一组对象?

假设我的Delphi类看起来像这样:

interface
type

    TMySubInfo = class
    public
        Name : string;
        Date : TDateTime;
        Age  : Integer;
    end;

    TMyInfo = class
    public
        Name : string;
        SubInfo : array of TMySubInfo;
        destructor Destroy; override;
    end;

implementation

    destructor TMyInfo.Destroy;
    begin
      // hmmm..
    end;

end.
Run Code Online (Sandbox Code Playgroud)

要正确清理,析构函数应该包含哪些内容?这样做是否足够SetLength(SubInfo,0),或者我是否需要循环并释放每个TMySubInfo?我需要做任何事情吗?

delphi memory-leaks

9
推荐指数
4
解决办法
2万
查看次数

如何使用Move测试类型是否可以安全复制

我正在写一个通用的矢量类型:

type
  TBigVector<T: record> = class
  private
    FSize: Integer;
    FEntries: TArray<T>;
    function GetEntry(Index: Integer): T; 
    procedure SetEntry(Index: Integer; const Value: T); 
    procedure SetSize(Value: Integer); 
  public
    constructor Create(ASize: Integer);
    property Size: Integer read FSize write SetSize;
    property Entry[Index: Integer]: T read GetEntry write SetEntry; default;
    procedure Zeroise;
    function ToArray: TArray<T>; 
  end;
Run Code Online (Sandbox Code Playgroud)

然后我想要派生这样的类:

TDoubleBigVector = class(TBigVector<Double>)
  ....
end;
TComplexBigVector = class(TBigVector<Complex>)
  ....
end;
Run Code Online (Sandbox Code Playgroud)

我必须派生类,因为我无法在泛型类型中实现算术运算.这是因为通用约束不够丰富,我不能约束T支持所需的算术运算.儿!

无论如何,够了.我的问题是关于执行ZeroiseToArray.出于性能原因,我想使用原始内存操作.例如,Zeroise可能是:

procedure TBigVector<T>.Zeroise;
begin
  ZeroMemory(Pointer(FEntries), Size*SizeOf(T));
end;
Run Code Online (Sandbox Code Playgroud)

现在,我可以为类型Double和我的定制 …

delphi

8
推荐指数
1
解决办法
290
查看次数

在Delphi 2009中,我是否需要释放变体数组?

如果我有一个只包含简单类型的变量数组,以及可能的其他简单类型的变体数组,我是否需要做任何明确的事情来释放内存,或者它是否都由我来处理.我一直认为没什么可做的,但我只是有点怀疑!

delphi memory-management

5
推荐指数
1
解决办法
1893
查看次数

计算数组中的元素数量

有没有办法通过使用代码计算数组中有多少元素?

例如:

arrName   : array[1..20] of string;
Run Code Online (Sandbox Code Playgroud)

我已经知道该数组中存储了6个名称,但是如何使用编码来确定?

arrays delphi

2
推荐指数
1
解决办法
4553
查看次数