Pointers 在Pascal中使用Dispose

Pointers 在Pascal中使用Dispose,pointers,pascal,freepascal,Pointers,Pascal,Freepascal,假设我有一个Pascal的链表。该类型的外观如下所示: type PList = ^TList; TList = record x: integer; Next: PList; end; var myList :PList; 所以如果我使用dispose(myList)那么myList中的所有指针都被释放了吗?或者只是指向myList的第一个元素的第一个元素?否,处理myList(顺便说一句,它应该是PList类型)将只

假设我有一个Pascal的链表。该类型的外观如下所示:

type
  PList = ^TList;
  TList = record
          x: integer;
          Next: PList;
          end;

var
  myList :PList;

所以如果我使用
dispose(myList)
那么myList中的所有指针都被释放了吗?或者只是指向myList的第一个元素的第一个元素?

否,处理
myList
(顺便说一句,它应该是
PList
类型)将只处理列表中的第一个项目。这是因为编译器不知道如何使用记录中的各个字段

例如,您可能正在使用跳过列表或双链接列表,这两种列表都需要记录中的两个指针

处理整个列表的方法如下所示

    var myList, listPtr, nextPtr : PList;
    :
    listPtr := myList;            (* start at start, obviously *)
    myList := nil;                (* mark list as empty        *)
    while listPtr <> nil do       (* continue until end        *)
    begin
        nextPtr := listPtr^.next; (* save pointer to next      *)
        dispose (listPtr);        (* kill current              *)
        listPtr := nextPtr;       (* move to next              *)
    end;

在本例中,您只处理已分配的变量,因此只处理
myList
。因此我会有内存泄漏?因为所有其他指针仍然在那里指向某些数据?是的。这将导致内存泄漏。以这种方式处置的将是托管类型,例如记录(不是指向记录的指针),或记录数组,但不是指针后面的任何内容。简单地说,
Dispose
将处理
New
分配的所有内容。请参阅注意-要应用Dispose,myList类型应为PList,而不是TList
Program TestProg(output);
    type
        PList = ^TList;
        TList = record
            num : integer;
            next: PList;
        end;

    var
        myList  : PList;
        listPtr : PList;
        nextPtr : PList;
begin
    (* Construct list 42 -> 99 -> 12 -| *)

    new (myList);
    new (myList^.next);
    new (myList^.next^.next);
    myList^.next^.next^.next := nil;

    myList^.num := 42;
    myList^.next^.num := 99;
    myList^.next^.next^.num := 12;

    (* Traverse list *)

    listPtr := myList;
    while listPtr <> nil do
    begin
        writeln (listptr^.num);
        listPtr := listPtr^.next;
    end;

    (* Clear list *)

    listPtr := myList;
    while listPtr <> nil do
    begin
        nextPtr := listPtr^.next;
        dispose (listPtr);
        listPtr := nextPtr;
    end;
    myList := nil;
end.