动态数组 ( 积分: 30 )

  • 主题发起人 主题发起人 squarevictory
  • 开始时间 开始时间
S

squarevictory

Unregistered / Unconfirmed
GUEST, unregistred user!
1。Edt:array of TEdit
//定义一个Edit控件数组
SetLength(Edt,num)
//设置数组的数量

2。Edt:array[1..10] of TEdit;

如果用方案一的话,在程序退出的时候会出错,提示:Invaild pointer operation;方案二则没有问题
我想问,是不是在方案一中由于数组数量是动态设置的,在程序退出的时候要释放数组呢,如果是那怎么释放呢?
 
1。Edt:array of TEdit
//定义一个Edit控件数组
SetLength(Edt,num)
//设置数组的数量

2。Edt:array[1..10] of TEdit;

如果用方案一的话,在程序退出的时候会出错,提示:Invaild pointer operation;方案二则没有问题
我想问,是不是在方案一中由于数组数量是动态设置的,在程序退出的时候要释放数组呢,如果是那怎么释放呢?
 
for i := Ord(High(Edt)) downto Ord(Low(Edt)) do
begin
freeandnil(Edt);
end;
没有试过,看看这样行不行???
 
SetLength处理的动态数组其下标是从0开始的,你的问题一定是试图从1开始引用,最后一个元素引用出界了
 
方案一没有问题,不会出错的.不过退出程序前最好要释放.
for i:= low(edt) to high(edt) do
edt.free;
还有要注意的是.如果你之前setlength(edt,10),后来setlength(edt,9)的话,也要释放edt[10];
edt[10].free;
setlength(edt,9);
以上如果不释放的话,程序运行不会有错,只是有内存可能泄露罢了.

至于Invaild pointer operation是非法指针操作.是不是你在程序退出时执行xxx.free之类,而xxx在这之前已经释放了.
 
解决了,原来是数组越界了,我是从1开始循环到NUM的,呵呵 真是大意啊。
谢谢大家了。
 
后退
顶部