Pointers 在Pascal中使用Dispose
假设我有一个Pascal的链表。该类型的外观如下所示: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类型)将只
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.