type
PMyList = ^AList;
AList = record
filename:PChar;
filesize:integer;
end;
var
ARecord: PMyList;
begin
New(ARecord);
ARecord^.filename:=PChar(一个字符串);
ARecord^.filesize:=0;
FileList.Add(ARecord);
Dispose(ARecord);
for B := 0 to (FileList.Count - 1) do
begin
new(ARecord);
ARecord := FileList.Items[B];
Dispose(ARecord);//这句话为什么出错!!说是非法的指针操作!
end;
FileList.Free;
end;
我怀疑是我的记录里又定义了一个PChar的原因,不知道对不对,请指教!
PMyList = ^AList;
AList = record
filename:PChar;
filesize:integer;
end;
var
ARecord: PMyList;
begin
New(ARecord);
ARecord^.filename:=PChar(一个字符串);
ARecord^.filesize:=0;
FileList.Add(ARecord);
Dispose(ARecord);
for B := 0 to (FileList.Count - 1) do
begin
new(ARecord);
ARecord := FileList.Items[B];
Dispose(ARecord);//这句话为什么出错!!说是非法的指针操作!
end;
FileList.Free;
end;
我怀疑是我的记录里又定义了一个PChar的原因,不知道对不对,请指教!
///////////////////////////
去掉这一句试试
...
ARecord^.filesize:=0;
FileList.Add(ARecord);
Dispose(ARecord);//去掉这个
...
我在List里加了三条记录,释放的时候前两条没有问题,最后一条就出问题可,为什么呀?
谢谢指教!
这个程序问题颇多:
1 New(ARecord); //这里分配了空间
2 ARecord^.filename:=PChar(一个字符串);
3 ARecord^.filesize:=0; //给空间里的附了值
4 FileList.Add(ARecord); //加入链表
5 Dispose(ARecord); //又释放了空间!!!!
6 for B := 0 to (FileList.Count - 1) do
7 begin
8 new(ARecord); //创建了空间!!!!
9 ARecord := FileList.Items[B]; //把指针指向了链表里保存的地址
10 Dispose(ARecord); //那个地址是刚才被你释放的,访问出错
11 end;
可以看出你对指针操作的概念不太熟悉
加入链表只是保存了一个地址,然后在第5句你又释放空间,那么链表中指向的就是一个无效的地址了。
而在第8行,ARecord本来就是一个指针,如果你要将他指向某一存在的地址,直接赋值即可。象现在这样写,你new出来的空间在第9句赋值后就无法再访问到,造成内存泄漏。如果你是想把其他的指针指向地址的内容存入你新分配空间,那么应该写
aRecord^ := PMyList(FileList.Items[B])^;
另外,指针操作现在大部分都是不必要使用的,建议你把Record改为类,通过对象完成相同的工作
for B := 0 to (FileList.Count - 1) do
begin
new(ARecord);//去掉这个
ARecord := FileList.Items[B];
Dispose(ARecord)
begin
// new(ARecord);
ARecord := FileList.Items[B];
Dispose(ARecord);
end;
5 Dispose(ARecord); //又释放了空间!!!!
去掉就成
begin
New(ARecord);
secondpos:=i;
ARecord^.filename:=一个PChar;
ARecord^.filesize:=0; showmessage(ARecord^.filename);//两次的结果竟然不一样
FileList.Add(ARecord);
showmessage(PMyList(FileList.Items[0])^.filename);//两次的结果竟然不一样
end;
为什么呀?