假设我有一个在Pascal中的链表。该类型看起来可能如下:
type
PList = ^TList;
TList = record
x: integer;
Next: PList;
end;
var
myList :PList;
如果我使用dispose(myList)
,那么myList中的所有指针都被释放了吗?还是只释放了指向myList第一个元素的第一个指针?
假设我有一个在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;
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.
Dispose
将处理New
分配的所有内容。 - TLamadispose(myList^)
这样的吗? - Superian007