在Pascal中使用Dispose

3

假设我有一个在Pascal中的链表。该类型看起来可能如下:

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

var
  myList :PList;

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


1
那我会有内存泄漏吗?因为所有其他指针仍然指向某些数据? - Superian007
是的,这将导致内存泄漏。以这种方式处理的将是托管类型,例如记录(而不是指向记录的指针),或者例如记录数组,但不包括指针所指向的任何内容。简单来说,Dispose将处理New分配的所有内容。 - TLama
还有一个问题,我该如何处理整个列表?类似dispose(myList^)这样的吗? - Superian007
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - xmojmr
2
注意:要应用Dispose,myList类型应为PList,而不是TList。 - MBo
显示剩余2条评论
1个回答

1
不,处理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;

你需要保存下一条记录的指针,因为一旦你处理完当前记录,就无法访问其字段。所以你必须在dispose之前保存它。
下面是一个完整的程序示例,它构造了一个包含两个元素的列表,打印出来后将整个列表处理掉。
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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接