当前位置:主页>销售管理软件> 列表

动态数组的问题 找什么财务软件好

仓库管理软件版1楼: 我在程序中定义了这样一个动态数组:

procedure DoSomething;
var

aDynamicArray: array of TAClass;
begin

setlength(aDynamicArray, Length);

for i:=1 to Length do
begin
aDynamicArray[i].Free;
aDynamicArray[i] := nil;
end;
end;

结果老是出错,后来把
for i:=1 to Length do
begin
aDynamicArray[i].Free;
aDynamicArray[i] := nil;
end;
部分删掉就正常了,哪位知道为什么,解释一下。不显式地调用free不会造成内存泄漏吗?

2楼: 数组是从0到length-1,而不是1到length所以改成
for i:=0 to Length-1 do
begin
aDynamicArray[i].Free;
aDynamicArray[i] := nil;
end;

如果不显示调用free,因为你的TAClass是局部变量,因此不会造成内存泄漏! 如免费用友erp软件

3楼: 数组从0 开始的,不是从1开始的。
动态数组采用生存期自管理技术,当变量离开作用域时自动释放资源。
所以你的动态数组不存在手动释放内存的问题。

4楼: 晕死,上面我打错了。
我很清楚数组是从0开始的。

如果如下:
procedure DoSomething;
var

aDynamicArray: array of TAClass;
begin

setlength(aDynamicArray, Length + 1);

for i:=1 to Length do
begin
aDynamicArray[i] := TAClass.Create;
end;
end;
这样没有显式调用Free,不会有内存泄漏的问题吗?

5楼: 不会的

6楼: 最后加句aDynamicArray:=nil;看行不行

仓库管理软件版7楼: 設置長度為3:
setlength(aDynamicArray, 3);

會列出下列3個:
aDynamicArray[0]:=
aDynamicArray[1]:=
aDynamicArray[2]:=

如果還有下列就會出錯:
aDynamicArray[3]:=

8楼: UnderTheRainForest:
发现我的问题比较蠢,自己写了个程序试了一下,确实是会泄漏的。

unit dynamicArray;

interface

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

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }


public
{ Public declarations }
end;

TAClass = class
c: char;
destructor Destroy;override;
end;

procedure test;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure test;
var
i, n: integer;
str: array of TAClass;
begin
n := 1000000;
setlength(str, n);
for i:=0 to n-1 do
begin
str[i] := TAClass.Create;
str[i].c := ''a'';
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer=0;
begin
for i:=1 to 10000 do
test;
end;

{ TAClass }

destructor TAClass.Destroy;
begin
form1.Edit1.Text := ''free'';
inherited;
end;

end.

9楼: 有没有这样试一下
for i:=0 to Length-1 do
begin
//aDynamicArray[i].Free;
aDynamicArray[i] := nil;
end;

10楼: 因为这里的动态数组的内容是一个对象的引用(指针),所以离开局域范围后,被释放的只是这个些引用,而不是真正的对象本身。所以还是会造成内存泄漏。

下面的代码与楼主的代码类似,但没有问题,所以觉得楼主的问题会不会不是最后释放造成的,

很在可能是在你最后的释放代码被执行前,数组中的成员就被释放了。还是请楼主仔细的看看中间的那些代码。

procedure TForm1.Button1Click(Sender: TObject);
var
AD:ARRAY OF Tedit;
i:integer;
begin
setlength(ad,3);
for i := 0 to 2 do
Begin
ad[i] := Tedit.Create(Self);
ad[i].Parent := Self;
ad[i].Top := i shl 5;
End;
showmessage(''look'');
for i := 0 to 2 do
ad[i].Free;
setlength(ad,0);
end;

11楼: 结了,谢过各位

12楼: 多人接受答案了。 如什么财务软件好