我创建了一个record链表,里面有10个节点,可是程序运行完后就不管了吗?书上说在删除一个节点的同时要dispose一下,难道我要释放整个链表也要循环遍历让指针逐一指向后释放??

解决方案 »

  1.   

    你的鏈表 是用 TList的麼...
    如果是的 這樣for n := 0 to yourList.Count - 1 do
    begin
      Dispose(yourList[n]);
    end;yourList.Free;即: 如果節點裡面保存的是指針 且指向自己創建的內存,就需要遍歷釋放所有 然後釋放自己 就ok
      

  2.   

    type
    point=^node
    node=record
      data:integer;
      next:point;
      end;
    var 
    p,q,r:point;
    new(q);r:=q;p:=q;
    while .. do
    begin
      q^.data:=23;
    new(q);
    r.next:=q;
    r:=q;
    end;
    就是这么简单的链表,创建完后我也知道如何访问和遍历,但是如何释放它呢?如果用完后不理它会出现致命错误吗?
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      p,q,r: point;
      n: Integer;
    begin
      new(p);
      p.data := -1;
      r := p; // first;
      
      for n := 0 to 4 do
      begin
        new(q);
        q.data := n;
        p.next := q;
        p      := p.next;
      end;
      p.next := nil;  while r.next <> nil do
      begin
        ShowMessage(IntToStr(r.data));
        q := r;
        r := r.next;
        Dispose(q);
      end;
      ShowMessage(IntToStr(r.data));
      Dispose(r);
    end;上面是 釋放 不釋放 會有內存洩漏。
      

  4.   

    当然,通过你这种方式实现的链表的占用的堆内存是N次分配的非连续空间,怎么可能一次释放?办法也有,你可以自己一次分配足够的内存做内存池,自己管理这块堆内存,一次性释放这个内存池就可以了呵呵,说了很多遍了,TList是用数组实现的,它和链表没有关系。
      

  5.   

    谢谢楼上的解释。虽然我在DELPHI中很少用到指针,但是也经常遇到一个指针变量赋过后直接再new()一下,而且程序结束后也只是把当前指针释放而已,那么之前分配的内存怎么释放啊?为什么不会出错?
      

  6.   

    beyondtkl(大龙驹<瓦特.好.歪>) ( ) 笔误了吧  
     
     
       你的鏈表 是用 TList的麼...
    如果是的 這樣for n := 0 to yourList.Count - 1 do
    begin
      Dispose(yourList[n]);//错误Dispose(yourList.Items[n]);
    end;yourList.Free;即: 如果節點裡面保存的是指針 且指向自己創建的內存,就需要遍歷釋放所有 然後釋放自己 就ok
      
     
      

  7.   

    hehe TO:  zhongxd(小禹)Dispose(yourList[n]);//
    這樣也是可以的 因為TList是由數組實現的 所以支持隨機存取 :-)tested by myself o