动态数组问题:SetLength后,要不要把数据销毁?(50分)

  • 主题发起人 主题发起人 比尔
  • 开始时间 开始时间

比尔

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure dosth;
var
s : array of TPoint;
begin
setLength(s,100);
...
??要不要销毁?
end;
 
我每次都FREE掉,不过听说这种程序一般都很难真正的从内存中将数据完全清掉,如果有
什么好方法也请告诉我
 
对基本变量,结构它要释放,结构中指针指向的内容不管,指针本身会释放。对象只会释放代表它的指针,但不会自动调用free
 
应该手工释放它所引用的对象,但本身对象指针可不主动释放,生存期完结后系统自动释放
 
要不Length = 0
 
重新分配数组长度后数组的记录就会消失的!
 
s := nil;
看看帮助,这样就会回收内存了。
 
Argee jiangxiancheng
 
动态数组不用手工释放
下面的话引自《delphi5开发人员指南》
动态数组是生存期自管理的,所以在用完它们以后没有必要释放,因为在离开作用域时它们会被
释放。然而,可能在离开作用域前,就需要删除动态数组(例如它用了很多内存)。要这么做,仅需要
把n i l赋值给动态数组:
SA:=nil
//释放S A
 
动态数据自生管理。可以不用干涉。
如果不放心,可以用指向空指针。
改变长度,如果是增加,不会影响前面的。
 
setLength() := 0就可以了。
最重要是数组的每个元素先要把它FREE掉。
 
天哪,几乎同时。。。楼上的各位。。。。

不好意思。我要修正一下。

Lenght := 0其实就可以了。不过你可以用nil来画龙染发。
 
SA:=nil 好象只是对应的的关系断了吧,变成了内存垃圾了,这是我的想法
我都是用 setLength(sa,0)的,当然这是我的意见,仅代表我个人
 
一段测试代码

代码:
const
  Len = 10;
var
  StrArr: array of string;
  PStr: ^string;
  I: Byte;
begin
  SetLength(StrArr, Len);
  for I := 0 to Len - 1 do
    StrArr[I] := IntToStr(I);
  PStr := @StrArr[0];

  StrArr := nil;

  for I := 0 to Len - 1 do
  begin
    ShowMessage(PStr^);
    Inc(PStr);
  end;
 
代码:
var
  PStr: ^string;

procedure TForm1.Button1Click(Sender: TObject);
const
  Len = 10;
var
  StrArr: array of string;
  I: Byte;
begin
  SetLength(StrArr, Len);
  for I := 0 to Len - 1 do
    StrArr[I] := IntToStr(I);
  PStr := @StrArr[0];

//  StrArr := nil;


end;

procedure TForm1.Button2Click(Sender: TObject);
const
  Len = 10;
var
  I: Byte;
begin
  for I := 0 to Len - 1 do
  begin
    ShowMessage(PStr^);
    Inc(PStr);
  end;

end;
 
为了验证此问题,可以用一种方法,你不能简单地释放内存在看他能否访问,一般都可以,因为,那块
内存还未被其它使用。
只要打开CPU调试,你可以明确地看出,并没有调用destroy代码。如果是对象,一定要调用的,
它才能保证你清掉对象包裹的对象。所以,对于对象,必须手动释放。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部