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的原因,不知道对不对,请指教!

解决方案 »

  1.   

    Dispose(ARecord);//这句话为什么出错!!说是非法的指针操作
    ///////////////////////////
    去掉这一句试试
      

  2.   

    说错了一点,应该是去掉第一个Dispose(ARecord);
      ...
      ARecord^.filesize:=0;
      FileList.Add(ARecord);
      Dispose(ARecord);//去掉这个
      ...
      

  3.   

    我做过了,确实好用,但是有这种情况:
    我在List里加了三条记录,释放的时候前两条没有问题,最后一条就出问题可,为什么呀?
    谢谢指教!
      

  4.   

    如果我没有理解错的话,你是要创建若干个Record,存入链表,然后在某个时间释放。
    这个程序问题颇多:
    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改为类,通过对象完成相同的工作
      

  5.   

    还有就是:第二个new(ARecord)多余,而且浪费内存空间
    for B := 0 to (FileList.Count - 1) do
    begin
      new(ARecord);//去掉这个
      ARecord := FileList.Items[B];
      Dispose(ARecord)
      

  6.   

    for B := (FileList.Count - 1) downto 0 do
      begin
    //      new(ARecord);
          ARecord := FileList.Items[B];
          Dispose(ARecord);
      end;
      

  7.   

    没有那么多麻烦的事情
    5   Dispose(ARecord);                       //又释放了空间!!!!
    去掉就成
      

  8.   

    for i:=1 to 一个数字 do
      begin
              New(ARecord);
              secondpos:=i;
              ARecord^.filename:=一个PChar;
              ARecord^.filesize:=0;         showmessage(ARecord^.filename);//两次的结果竟然不一样
              FileList.Add(ARecord);
              showmessage(PMyList(FileList.Items[0])^.filename);//两次的结果竟然不一样
      end;
    为什么呀?
      

  9.   

    不能两次从复 new(ARecord);