TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 1
• Pointer = adres in het geheugen, is zelf geen geheugen!• Expliciet geheugen aanvragen vóór gebruik & Expliciet
geheugen vrijmaken na gebruik!• Voordelen:
Dynamisch aanmaken van geheugen voor bvb arrays … Recursieve definitie van gegevens, bvb voor lijsten, binaire
bomen, …
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 2
MODULE PointerIntro;<* M2EXTENSIONS + *> <* STORAGE + *>
TYPEmytype = POINTER TO RECORD eerste: CARDINAL;
tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL;
END; END;
VARp: mytype;i,j: INTEGER;
BEGIN
NEW(p);p^.eerste := 101;
p^.tweede[5][8].knal := 102;
NEW(p^.tweede[5][8].boem,15);p^.tweede[5][8].boem^[10] := 103;
WrCard(p^.eerste,2);WrLn;WrCard(p^.tweede[5][8].knal,2);WrLn;WrCard(p^.tweede[5][8].boem^[10],2);WrLn;
DISPOSE(p^.tweede[5][8].boem); (* ALLE dynamisch aangemaakte variabelen (dmv NEW()) moeten gedisposed worden! *)DISPOSE(p);
END PointerIntro.
Syntax: definitie
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 3
MODULE PointerIntro;<* M2EXTENSIONS + *> <* STORAGE + *>
TYPEmytype = POINTER TO RECORD eerste: CARDINAL;
tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL;
END; END;
VAR
p: mytype;i,j: INTEGER;
BEGIN
NEW(p);p^.eerste := 101;
p^.tweede[5][8].knal := 102;
NEW(p^.tweede[5][8].boem,15);p^.tweede[5][8].boem^[10] := 103;
WrCard(p^.eerste,2);WrLn;WrCard(p^.tweede[5][8].knal,2);WrLn;WrCard(p^.tweede[5][8].boem^[10],2);WrLn;
DISPOSE(p^.tweede[5][8].boem); (* ALLE dynamisch aangemaakte variabelen (dmv NEW()) moeten gedisposed worden! *)DISPOSE(p);
END PointerIntro.
Pointers zijn adressen, geen geheugen!!!
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 4
MODULE PointerIntro;<* M2EXTENSIONS + *> <* STORAGE + *>
TYPEmytype = POINTER TO RECORD eerste: CARDINAL;
tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL;
END; END;
VAR
p: mytype;i,j: INTEGER;
BEGIN
NEW(p);p^.eerste := 101;
p^.tweede[5][8].knal := 102;
NEW(p^.tweede[5][8].boem,15);p^.tweede[5][8].boem^[10] := 103;
WrCard(p^.eerste,2);WrLn;WrCard(p^.tweede[5][8].knal,2);WrLn;WrCard(p^.tweede[5][8].boem^[10],2);WrLn;
DISPOSE(p^.tweede[5][8].boem); (* ALLE dynamisch aangemaakte variabelen (dmv NEW()) moeten gedisposed worden! *)DISPOSE(p);
END PointerIntro.
Pointers zijn adressen, geen geheugen!!! VOORDELEN?
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 5
MODULE PointerIntro;<* M2EXTENSIONS + *> <* STORAGE + *>
TYPEmytype = POINTER TO RECORD eerste: CARDINAL;
tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL;
END; END;
VAR
p: mytype;i,j: INTEGER;
BEGIN
NEW(p);p^.eerste := 101;
p^.tweede[5][8].knal := 102;
NEW(p^.tweede[5][8].boem,15);p^.tweede[5][8].boem^[10] := 103;
WrCard(p^.eerste,2);WrLn;WrCard(p^.tweede[5][8].knal,2);WrLn;WrCard(p^.tweede[5][8].boem^[10],2);WrLn;
DISPOSE(p^.tweede[5][8].boem); (* ALLE dynamisch aangemaakte variabelen (dmv NEW()) moeten gedisposed worden! *)DISPOSE(p);
END PointerIntro.
Pointers zijn adressen, geen geheugen!!!Voordelen:-p en boem nemen geen plaats in, zolang er niet expliciet geheugen voor wordt gereserveerd.
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 6
MODULE PointerIntro;<* M2EXTENSIONS + *> <* STORAGE + *>
TYPEmytype = POINTER TO RECORD eerste: CARDINAL;
tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL;
END; END;
VARp: mytype;i,j: INTEGER;
BEGIN
NEW(p);p^.eerste := 101;
p^.tweede[5][8].knal := 102;
NEW(p^.tweede[5][8].boem,15);p^.tweede[5][8].boem^[10] := 103;
WrCard(p^.eerste,2);WrLn;WrCard(p^.tweede[5][8].knal,2);WrLn;WrCard(p^.tweede[5][8].boem^[10],2);WrLn;
DISPOSE(p^.tweede[5][8].boem); (* ALLE dynamisch aangemaakte variabelen (dmv NEW()) moeten gedisposed worden! *)DISPOSE(p);
END PointerIntro.
Pointers zijn adressen, geen geheugen!!! Eerst geheugen reserveren!
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 7
MODULE PointerIntro;<* M2EXTENSIONS + *> <* STORAGE + *>
TYPEmytype = POINTER TO RECORD eerste: CARDINAL;
tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL;
END; END;
VARp: mytype;i,j: INTEGER;
BEGIN
NEW(p);p^.eerste := 101;
p^.tweede[5][8].knal := 102;
NEW(p^.tweede[5][8].boem,15);p^.tweede[5][8].boem^[10] := 103;
WrCard(p^.eerste,2);WrLn;WrCard(p^.tweede[5][8].knal,2);WrLn;WrCard(p^.tweede[5][8].boem^[10],2);WrLn;
DISPOSE(p^.tweede[5][8].boem); (* ALLE dynamisch aangemaakte variabelen (dmv NEW()) moeten gedisposed worden! *)DISPOSE(p);
END PointerIntro.
Pointers zijn adressen, geen geheugen!!!Eerst geheugen reserveren!
Variabele: NEW(p)
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 8
MODULE PointerIntro;<* M2EXTENSIONS + *> <* STORAGE + *>
TYPEmytype = POINTER TO RECORD eerste: CARDINAL;
tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL;
END; END;
VARp: mytype;i,j: INTEGER;
BEGIN
NEW(p);p^.eerste := 101;
p^.tweede[5][8].knal := 102;
NEW(p^.tweede[5][8].boem,15);p^.tweede[5][8].boem^[10] := 103;
WrCard(p^.eerste,2);WrLn;WrCard(p^.tweede[5][8].knal,2);WrLn;WrCard(p^.tweede[5][8].boem^[10],2);WrLn;
DISPOSE(p^.tweede[5][8].boem); (* ALLE dynamisch aangemaakte variabelen (dmv NEW()) moeten gedisposed worden! *)DISPOSE(p);
END PointerIntro.
Pointers zijn adressen, geen geheugen!!!Gebruiken
p^ => RECORD
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 9
MODULE PointerIntro;<* M2EXTENSIONS + *> <* STORAGE + *>
TYPEmytype = POINTER TO RECORD eerste: CARDINAL;
tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL;
END; END;
VARp: mytype;i,j: INTEGER;
BEGIN
NEW(p);p^.eerste := 101;
p^.tweede[5][8].knal := 102;
NEW(p^.tweede[5][8].boem,15);p^.tweede[5][8].boem^[10] := 103;
WrCard(p^.eerste,2);WrLn;WrCard(p^.tweede[5][8].knal,2);WrLn;WrCard(p^.tweede[5][8].boem^[10],2);WrLn;
DISPOSE(p^.tweede[5][8].boem); (* ALLE dynamisch aangemaakte variabelen (dmv NEW()) moeten gedisposed worden! *)DISPOSE(p);
END PointerIntro.
Pointers zijn adressen, geen geheugen!!!Eerst geheugen reserveren!
Open Array: NEW(x,Aantal_kotjes)
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 10
MODULE PointerIntro;<* M2EXTENSIONS + *> <* STORAGE + *>
TYPEmytype = POINTER TO RECORD eerste: CARDINAL;
tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL;
END; END;
VARp: mytype;i,j: INTEGER;
BEGIN
NEW(p);p^.eerste := 101;
p^.tweede[5][8].knal := 102;
NEW(p^.tweede[5][8].boem,15);p^.tweede[5][8].boem^[10] := 103;
WrCard(p^.eerste,2);WrLn;WrCard(p^.tweede[5][8].knal,2);WrLn;WrCard(p^.tweede[5][8].boem^[10],2);WrLn;
DISPOSE(p^.tweede[5][8].boem); (* ALLE dynamisch aangemaakte variabelen (dmv NEW()) moeten gedisposed worden! *)DISPOSE(p);
END PointerIntro.
Pointers zijn adressen, geen geheugen!!!Open Array: VOORDELEN
Dynamisch aanmaken van geheugen Mogelijk voor elke array een
verschillende grootte te geven
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 11
MODULE PointerIntro;<* M2EXTENSIONS + *> <* STORAGE + *>
TYPEmytype = POINTER TO RECORD eerste: CARDINAL;
tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL;
END; END;
VARp: mytype;i,j: INTEGER;
BEGIN
NEW(p);p^.eerste := 101;
p^.tweede[5][8].knal := 102;
NEW(p^.tweede[5][8].boem,15);p^.tweede[5][8].boem^[10] := 103;
WrCard(p^.eerste,2);WrLn;WrCard(p^.tweede[5][8].knal,2);WrLn;WrCard(p^.tweede[5][8].boem^[10],2);WrLn;
DISPOSE(p^.tweede[5][8].boem); (* ALLE dynamisch aangemaakte variabelen (dmv NEW()) moeten gedisposed worden! *)DISPOSE(p);
END PointerIntro.
Pointers zijn adressen, geen geheugen!!!LET OP!
- Gereserveerd geheugen moet vrijgegeven worden: DISPOSE(..)
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 12
Pointers zijn adressen, geen geheugen!!!Geheugen moet gereserveerd worden: NEW(…)Geheugen moet vrijgegeven worden:DISPOSE(…)
MOGELIJKE PROBLEMEN:
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 13
Pointers zijn adressen, geen geheugen!!!Geheugen moet gereserveerd worden: NEW(…)Geheugen moet vrijgegeven worden:DISPOSE(…)
MOGELIJKE PROBLEMEN: MEMORY LEAKS: de volgorde van vrijgeven is
belangrijk + zorg steeds dat je aan het stukje geheugen kan!
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 14
Pointers zijn adressen, geen geheugen!!!Geheugen moet gereserveerd worden: NEW(…)Geheugen moet vrijgegeven worden:DISPOSE(…)
MOGELIJKE PROBLEMEN: MEMORY LEAKS: de volgorde van vrijgeven is
belangrijk + zorg steeds dat je aan het stukje geheugen kan! MEMORY CORRUPTIE: Vrijgegeven geheugen
mag geen link meer hebben in statische variabelen.
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 15
DISPOSE(p^.tweede[5][8].boem); DISPOSE(p); OK!
MEMORY LEAK:DISPOSE(…) in de juiste volgorde!!!
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 16
DISPOSE(p);
DISPOSE(p^.tweede[5][8].boem);
NIET OK! p is niet meer toegangelijk na
DISPOSE boem kan niet meer verwijderd
worden, want link is verdwenen MEMORY LEAK!!!
MEMORY LEAK:DISPOSE(…) in de juiste volgorde!!!
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 17
PROCEDURE addToList(myList: ptrList); VAR temp: ptrList;BEGIN NEW(temp); temp.next := myList;END addToList;
VAR funnyList: ptrList;BEGIN….addToList(funnyList);
MEMORY LEAK:NEW() Zorg dat de link niet verdwijnt
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 18
PROCEDURE addToList(myList: ptrList); VAR temp: ptrList;BEGIN NEW(temp); temp.next := myList;END addToList;
VAR funnyList: ptrList;BEGIN….addToList(funnyList);
MEMORY LEAK:NEW() Zorg dat de link niet verdwijnt
Geheugen reserveren
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 19
PROCEDURE addToList(myList: ptrList); VAR temp: ptrList;BEGIN NEW(temp); temp.next := myList;END addToList;
VAR funnyList: ptrList;BEGIN….addToList(funnyList);
MEMORY LEAK:NEW() Zorg dat de link niet verdwijnt
Geheugen reserveren
Na oproep, funnyList = NILGeen link naar gereserveerd geheugen MEMORY LEAK
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 20
Pointers zijn adressen, geen geheugen!!!Geheugen moet gereserveerd worden: NEW(…)Geheugen moet vrijgegeven worden:DISPOSE(…)
MOGELIJKE PROBLEMEN: MEMORY CORRUPTIE: Vrijgegeven geheugen
mag geen link meer hebben in statische variabelen.
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 21
Pointers zijn adressen, geen geheugen!!!Geheugen moet gereserveerd worden: NEW(…)Geheugen moet vrijgegeven worden:DISPOSE(…)
PROCEDURE disposeList(myList: ptrList); VAR temp: ptrList;BEGIN WHILE myList # NIL DO
temp = myList;myList = myList.next;DISPOSE(temp);
END;END disposeList;
VAR funnyList: ptrList;BEGIN….disposeList(funnyList);
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 22
PROCEDURE disposeList(myList: ptrList); VAR temp: ptrList;BEGIN WHILE myList # NIL DO
temp = myList;myList = myList.next;DISPOSE(temp);
END;END disposeList;
VAR funnyList: ptrList;BEGIN….disposeList(funnyList);
Item 1Item 1 Item 2Item 2 Item 3Item 3 Item 4Item 4Item 1
Item 2
Item 3
Item 4
Geheugen gereserveerd
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 23
PROCEDURE disposeList(myList: ptrList); VAR temp: ptrList;BEGIN WHILE myList # NIL DO
temp = myList;myList = myList.next;DISPOSE(temp);
END;END disposeList;
VAR funnyList: ptrList;BEGIN….disposeList(funnyList);
Item 1Item 1 Item 2Item 2 Item 3Item 3 Item 4Item 4Item 1
Item 2
Item 3
Item 4
Geheugen vrij gegeven!
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 24
PROCEDURE disposeList(myList: ptrList); VAR temp: ptrList;BEGIN WHILE myList # NIL DO
temp = myList;myList = myList.next;DISPOSE(temp);
END;END disposeList;
VAR funnyList: ptrList;BEGIN….disposeList(funnyList);…addNewItem(funnyList, newFunnything);
Item 1Item 1 Item 2Item 2 Item 3Item 3 Item 4Item 4Item 1
Item 2
Item 3
Item 5
Item 5Item 5
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 25
PROCEDURE disposeList(myList: ptrList); VAR temp: ptrList;BEGIN WHILE myList # NIL DO
temp = myList;myList = myList.next;DISPOSE(temp);
END;END disposeList;
VAR funnyList: ptrList;BEGIN….disposeList(funnyList);…addNewItem(funnyList, newFunnything);
Item 1Item 1 Item 2Item 2 Item 3Item 3 Item 4Item 4Item 1
Item 2
Item 3
Item 5
Item 5Item 5
Maar Item 4 = Item 5 in geheugen
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 26
PROCEDURE disposeList(myList: ptrList); VAR temp: ptrList;BEGIN WHILE myList # NIL DO
temp = myList;myList = myList.next;DISPOSE(temp);
END;END disposeList;
VAR funnyList: ptrList;BEGIN….disposeList(funnyList);…addNewItem(funnyList, newFunnything);
Item 1Item 1 Item 2Item 2 Item 3Item 3 Item 5Item 5Item 1
Item 2
Item 3
Item 5
Maar Item 4 = Item 5 in geheugen
TOPIC O: Pointers
http://parallel.vub.ac.be/| pag. 27
PROCEDURE disposeList(myList: ptrList); VAR temp: ptrList;BEGIN WHILE myList # NIL DO
temp = myList;myList = myList.next;DISPOSE(temp);
END;END disposeList;
VAR funnyList: ptrList;BEGIN….disposeList(funnyList);…addNewItem(funnyList, newFunnything);
Item 1Item 1 Item 2Item 2 Item 3Item 3 Item 5Item 5Item 1
Item 2
Item 3
Item 5
CORRUPT GEHEUGEN!!!