动态数组的问题 找什么财务软件好
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楼: 多人接受答案了。 如什么财务软件好