记录类型数组如何清除?(50分)

  • 主题发起人 doll_paul
  • 开始时间
W

wqthai

Unregistered / Unconfirmed
GUEST, unregistred user!
请问:用什么方法可以测试内存是释放掉了,还是没有释放掉呢??
 
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
to thx1180,感谢老兄把帮助COPY过来,且译成中文。我的一个好友也把这段文章提供给我了。

但上面并没有说,NIL和SETXXXX可以安全清除啊!!!

不占内存等于安全清除吗???
 
T

thx1180

Unregistered / Unconfirmed
GUEST, unregistred user!
以下是《Delphi 5开发人员指南》第二章中对动态数组的说明:
2.7.2 动态数组
动态数组是在编译时不知道维数,在运行时动态分配的数组。为了声明一个动态数组,只要在声明时不要指定维数,就像这样:
var
SA: array of string;
在用动态数组前,用SetLength()过程为数组分配内存:
begin
SetLength(SA, 33);
一旦空间被分配了,你就能像访问普通数组一样访问动态数组:
注意动态数组通常是以0为基准的。
★★★动态数组是生存期自管理的,所以在用完它们以后没有必要释放,因为在离开作用域时它们会被释放。然而,可能在离开作用域前,就需要删除动态数组(例如它用了很多内存)。要这么做,仅需要把nil赋值给动态数组:
SA:=nil
//释放SA
 
Z

zhukewen

Unregistered / Unconfirmed
GUEST, unregistred user!
楼主的方法是安全的
 
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
to thx1180,再次感谢老兄帮助查找资料!

小弟最后一个疑问是,如果我定义的是全局数组呢?以上说明也一样适用吗?

再次麻烦老兄!!
 
H

he_zhaohui

Unregistered / Unconfirmed
GUEST, unregistred user!
全局变量在程序结束的时候自动释放
 
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
大家看看这段~我是清空,它是清0,应该和我的问题无关吧?

来自:skyweb, 时间:2002-1-5 2:38:00, ID:835731
FillChar等不能清零的数组有:
a: array[0..100] of string;
b: array[0..100] of TObject;
...
因为对象都是存在堆中的,数组中只是存的指针,清除数组的结果是...,内存泄漏
同样的道理可用于string类型和其它只存指针在数组里的类型.

记录也是一样:
Ta = record
a1: integer;
a2: string[3];
end;
可以正常清除
Tb = record
b1: integer;
b2: ansistring;
end;
不能正常清除

综上所述,FillChar等函数并不是万能的.只能正确清除简单数据类型的数组和记录.
实在不行的时候,你只能for它一次了:)
 
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
接上:

来自:zw84611, 时间:2002-1-5 11:22:00, ID:836176
to skyweb:
a: array[0..100] of string;
b: array[0..100] of TObject;
似乎也行呀,您试试:
FillChar(a,sizeof(a),0);
FillChar(b,sizeof(b),0);

来自:skyweb, 时间:2002-1-9 0:02:00, ID:843893
to zw84611:
a: array[0..100] of string;
b: array[0..100] of TObject;

FillChar(a,sizeof(a),0);
FillChar(b,sizeof(b),0);
确实可以把数组清零了,但这只是把一个指针数组清零了,
没能释放数组引用到的string和TObject对象所占用的空间,
造成所谓的内存泄漏,大量的内存泄漏不用说会引起什么情况:内存耗尽……系统崩溃!
 
T

thx1180

Unregistered / Unconfirmed
GUEST, unregistred user!
按《Delphi 5开发人员指南》第二章中对动态数组的说法,全局变量也会自动释放的。
如果动态数组的元素是指向对象的指针,那些对象当然要你来释放呐。你可以看看
Classes单元中TList类的例子,它的内部使用的就是用动态数组来保存指针的。
 
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
to thx1180,但上面的a: array[0..100] of string;并不是对象指针啊!!!

请各位多多发言,本帖的分,单加100!!!
 
T

thx1180

Unregistered / Unconfirmed
GUEST, unregistred user!
string类型的指针要设为nil(空指针)才释放内存。
 
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
但我上面COPY的那二段内容,好像不是这样说的吧??
 
T

thx1180

Unregistered / Unconfirmed
GUEST, unregistred user!
还是要用循环来清:

procedure TForm1.Button1Click(Sender: TObject);
var
a: array[0..100] of string;
I: Integer;
begin
for I := Low(a) to High(a) do
a := '';
end;
 
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
to thx1180,老兄给的代码是清0,我现在是清空,即DEL!!!!
 
T

thx1180

Unregistered / Unconfirmed
GUEST, unregistred user!
先清0,再清空。
 
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
如果字符串是定长呢?
 
E

esuper2000

Unregistered / Unconfirmed
GUEST, unregistred user!
nil就可以了
 
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
如果没人发言结帖了!!!
 
L

lightstar

Unregistered / Unconfirmed
GUEST, unregistred user!
to thx1180:
String类型也是生存期自管理的,不需要特别释放,在程序中对String赋nil只是提前释放不使用的内存而已,并不是说string会造成内存泄漏
 
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
好像还有争议啊,大家再说说吧~
 

Similar threads

S
回复
0
查看
948
SUNSTONE的Delphi笔记
S
S
回复
0
查看
769
SUNSTONE的Delphi笔记
S
顶部