TOPIC O: Pointers | 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 | pag. 2 MODULE PointerIntro; TYPE mytype = POINTER TO RECORD eerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL; 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. Syntax: definitie
TOPIC O: Pointers | pag. 3 MODULE PointerIntro; TYPE mytype = POINTER TO RECORD eerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL; 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 | pag. 4 MODULE PointerIntro; TYPE mytype = POINTER TO RECORD eerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL; 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 | pag. 5 MODULE PointerIntro; TYPE mytype = POINTER TO RECORD eerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL; 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 | pag. 6 MODULE PointerIntro; TYPE mytype = POINTER TO RECORD eerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL; 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!!! Eerst geheugen reserveren!
TOPIC O: Pointers | pag. 7 MODULE PointerIntro; TYPE mytype = POINTER TO RECORD eerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL; 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!!! Eerst geheugen reserveren! Variabele: NEW(p)
TOPIC O: Pointers | pag. 8 MODULE PointerIntro; TYPE mytype = POINTER TO RECORD eerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL; 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!!! Gebruiken p^ => RECORD
TOPIC O: Pointers | pag. 9 MODULE PointerIntro; TYPE mytype = POINTER TO RECORD eerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL; 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!!! Eerst geheugen reserveren! Open Array: NEW(x,Aantal_kotjes)
TOPIC O: Pointers | pag. 10 MODULE PointerIntro; TYPE mytype = POINTER TO RECORD eerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL; 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!!! Open Array: VOORDELEN Dynamisch aanmaken van geheugen Mogelijk voor elke array een verschillende grootte te geven
TOPIC O: Pointers | pag. 11 MODULE PointerIntro; TYPE mytype = POINTER TO RECORD eerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OF RECORD knal: CARDINAL; boem: POINTER TO ARRAY OF CARDINAL; 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!!! LET OP! - Gereserveerd geheugen moet vrijgegeven worden: DISPOSE(..)
TOPIC O: Pointers | pag. 12 Pointers zijn adressen, geen geheugen!!! Geheugen moet gereserveerd worden: NEW(…) Geheugen moet vrijgegeven worden: DISPOSE(…) MOGELIJKE PROBLEMEN:
TOPIC O: Pointers | 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 | 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 | pag. 15 DISPOSE(p^.tweede[5][8].boem); DISPOSE(p); OK! MEMORY LEAK: DISPOSE(…) in de juiste volgorde!!!
TOPIC O: Pointers | 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 | 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 | 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 | 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 = NIL Geen link naar gereserveerd geheugen MEMORY LEAK
TOPIC O: Pointers | 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 | 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 | 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 1 Item 2 Item 3 Item 4 Item 1 Item 2 Item 3 Item 4 Geheugen gereserveerd
TOPIC O: Pointers | 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 1 Item 2 Item 3 Item 4 Item 1 Item 2 Item 3 Item 4 Geheugen vrij gegeven!
TOPIC O: Pointers | 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 1 Item 2 Item 3 Item 4 Item 1 Item 2 Item 3 Item 5
TOPIC O: Pointers | 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 1 Item 2 Item 3 Item 4 Item 1 Item 2 Item 3 Item 5 Maar Item 4 = Item 5 in geheugen
TOPIC O: Pointers | 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 1 Item 2 Item 3 Item 5 Item 1 Item 2 Item 3 Item 5 Maar Item 4 = Item 5 in geheugen
TOPIC O: Pointers | 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 1 Item 2 Item 3 Item 5 Item 1 Item 2 Item 3 Item 5 CORRUPT GEHEUGEN!!!