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

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

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
例如:
type
TRecord = Record
f1: Integer;
f2: Boolean;
end;

var
ff: array of TRecord;

如果我之前做了:SetLength(ff, 10);

现在我要清除这个数组,SetLength(ff, 0);

请问,这个做对不对,如果对。是否安全呢???
 
S

shbjkl

Unregistered / Unconfirmed
GUEST, unregistred user!
最简单的方法
ff:=nil;
 
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
是否安全,这是关键的!!!!
 
Y

yangying_2000

Unregistered / Unconfirmed
GUEST, unregistred user!
不安全,因为里面的记录没有清空,
最好FF这样定义:
type
PRecord = ^TRecord
TRecord = Record
f1: Integer;
f2: Boolean;
end;

var
ff: array of PRecord;

释放时这样写:
for i := Low(ff) to high(ff) do
Dispose(ff);
ff := nil;

呵呵,给分吧,VCL里面都是这样写的
 
L

LeeChange

Unregistered / Unconfirmed
GUEST, unregistred user!
没有必要把动态数组的长度设置为0.
 
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
to yangying_2000,如何不使用指针呢?。

to LeeChange,那怎么做,老兄请说!
 
L

LeeChange

Unregistered / Unconfirmed
GUEST, unregistred user!
用完了就算,不用管了.
 
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
to LeeChange,小弟晕,不会有内存洞洞???
 

太阳火

Unregistered / Unconfirmed
GUEST, unregistred user!
ff := nil
就可以了。记录没必要清空,就好像不要释放integer一样
 
H

he_zhaohui

Unregistered / Unconfirmed
GUEST, unregistred user!
应该是不用清空的
因为记录数组的内存空间不是你分配的
所以不应该由你来释放

程序结束时会自己释放
 
W

wqthai

Unregistered / Unconfirmed
GUEST, unregistred user!
我了解,局部变量在栈中分配内存的变量可以不用手工释放,只要退出作用域,系统
会自动清除内存区域。如果是在堆中动态分配的内存区域应手工释放。比如
getmem获得的内存就属此类。
但是动态数组区域是否是自动释放我不清楚。请高人告诉我。谢谢!
 
H

he_zhaohui

Unregistered / Unconfirmed
GUEST, unregistred user!
很简单
做一个测试程序是一下,看看会不会造成死机
 
P

Pipi.

Unregistered / Unconfirmed
GUEST, unregistred user!
如果ff十分的大,那么 SetLength(ff, 0)
可以立即减小内存的占用,不影响其他进程的运行
但是如果ff比较小,set不set都无所谓了,他如果是全局变量,退出的时候会清除的。
即使自己没有清除,操作系统也一下子把它全清除了
 
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
to all,谢谢以个各位大侠的指点。

小弟还是希望可以得到更具体和更确切的回答。因为小弟的这个小程序要在服务器上运行,并且是24小时开机的。因此,怕出现内存洞洞。

请大家继续,谢谢了~

另,小弟的一个朋友已经查了帮助。帮助上好像是说,NIL和SETXXXX都可以安全清除。但不知道具体如何。请有经验的继续发表意见!
 
G

gyang

Unregistered / Unconfirmed
GUEST, unregistred user!
你又没用指针,没问题的,不用管它,
SetLength(ff, 0) 或 ff := nil 或 不管它
都可以
 
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
to gyang,那也就是说,如果不是按yangying_2000兄说的,用指针的话。就可以看D自己帮
助上说的,NIL或SETXXX为0,就可以安全清楚了是吧?
 
Y

yk46

Unregistered / Unconfirmed
GUEST, unregistred user!
ff:=nil;
即可
 
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
没有高手回复这个基础问题了吗?
 
T

thx1180

Unregistered / Unconfirmed
GUEST, unregistred user!
这是帮助上的原文:
Variables
Long strings, wide strings, dynamic arrays, variants, and interfaces are heap-allocated, but their memory is managed automatically.
也就是说动态数组变量的内存空间分配在堆栈中,但内存是自动管理的。
Dynamic array types
A dynamic-array variable occupies four bytes of memory which contain a pointer to the dynamically allocated array. When the variable is empty (uninitialized) or holds a zero-length array, the pointer is nil and no dynamic memory is associated with the variable.
一个动态数组变量在为空(未初始化)或者长度为零、指针为nil时动态数组均不会占用内存空间。
 
Y

yangying_2000

Unregistered / Unconfirmed
GUEST, unregistred user!
你使用记录本身也要生成一个指针啊,是一样的,只是这是由你自己分配和释放内存,要稳定些
 

Similar threads

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