数组释放问题?(50分)

  • 主题发起人 主题发起人 cn01574978
  • 开始时间 开始时间
C

cn01574978

Unregistered / Unconfirmed
GUEST, unregistred user!
大家好 问个问题:
type Ta=array of array of TStringList;
var a:Ta;
在对这个多唯数组操作后
我怎么才能对这个数组进行释放。
我试用了好多方法好象都不行。
setLength(a,0,0)
a:=nil
Finalize(a)
用循环 释放TStringList a[循环数][循环数].free;
a 在局部声明,当局部 过程 结束后 就出错。
a 在全局声明,当窗体关闭时 就出错。
他们的提示都是 无效的指针操作。
谢谢各位给个提示,要怎么做。
谢谢谢谢。。。。
 
type
Ta=array of array of TStringList;
var
a:Ta;
I, J : Integer;
begin
//分配数组
SetLength(a, 10, 10);
//创建数组的每一项,二维数组实际上可以理解为数组的数组...
for I := Low(a) to high(a)do
for J := Low(a) to High(a)do
a[I, J] := TStringList.Create;
//......
//释放数组的每一项,二维数组实际上可以理解为数组的数组...
for I := Low(a) to high(a)do
for J := Low(a) to High(a)do
a[I, J].Free;
//释放数组,其实不这样做也可以的.动态数组生命期是自管理的
a := nil;
end;
 
你好 谢谢你的回答。
我的做法和你写的基本相同,不同的是 没有用到 Low(a) high(a) 这两个。
我是这样写的:
type
Ta=array of array of TStringList;
var
a:Ta;
I, J : Integer;
程序过程();
begin
//分配数组
SetLength(a, 10, 10);
for I := 1 to 10do
//这里我其实写的是个自定义函数,用参数 _a 带入 a 的;
for J := 1 to 10do
//这里我其实写的是个自定义函数,用参数 _a_ 带入 a 的;
a[I, J] := TStringList.Create;
//_a_[j] := TStringList.Create;
//......
end;
窗体Close();
begin
for I := 1 to 10do
for J := 1 to 10do
a[I, J].Free;
a := nil;
end;
当运行到 a := nil;
时 就出错 ‘无效的指针操作’。
如果不用 a := nil;
程序运行到结束时 就出错 ‘无效的指针操作’。
请问 我这样写是不是就是出错的原因?
谢谢谢谢啊。。
 
SetLength(a, 10, 10);

for I := 0 to 9do
for J := 0 to 9do
 
楼主: 你不用low与high也可以, 但你写错了动态数组的下标, 应该是0..9, 不是1..10
这个问题你可以参考下面帖子中本人的详细解答:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3893166
 
SetLength(a, 10, 10);以后a的维数是[0..9,0..9]
for I := 1 to 10do

for J := 1 to 10do
本身就越界了.肯定会出现一些不可预料的错误.
你可以改成for I:= 0 to 9do
和for J := 0 to 9do
就可以了

Low,High函数是取数组的下界和上界.所以用Low和High是个好习惯.前面你不管怎么分配,都不会影响到这里的代码.
 
非常谢谢各位,果然是 我的数组的上下界没有弄清 谢谢你们 照你们的方法改了后 程序运行正常。
 

Similar threads

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