270 likes | 407 Views
TOPIC O: Pointers. 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 …
E N D
TOPIC O: Pointers • 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 MODULEPointerIntro; <* M2EXTENSIONS + *> <* STORAGE + *> TYPE mytype = POINTERTORECORDeerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OFRECORDknal: CARDINAL; boem: POINTERTOARRAYOF 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 dynamischaangemaaktevariabelen (dmv NEW()) moetengedisposedworden! *) DISPOSE(p); ENDPointerIntro. Syntax: definitie
TOPIC O: Pointers MODULEPointerIntro; <* M2EXTENSIONS + *> <* STORAGE + *> TYPE mytype = POINTERTORECORDeerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OFRECORDknal: CARDINAL; boem: POINTERTOARRAYOF 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 dynamischaangemaaktevariabelen (dmv NEW()) moetengedisposedworden! *) DISPOSE(p); ENDPointerIntro. Pointers zijn adressen, geen geheugen!!!
TOPIC O: Pointers MODULEPointerIntro; <* M2EXTENSIONS + *> <* STORAGE + *> TYPE mytype = POINTERTORECORDeerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OFRECORDknal: CARDINAL; boem: POINTERTOARRAYOF 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 dynamischaangemaaktevariabelen (dmv NEW()) moetengedisposedworden! *) DISPOSE(p); ENDPointerIntro. Pointers zijn adressen, geen geheugen!!! VOORDELEN?
TOPIC O: Pointers MODULEPointerIntro; <* M2EXTENSIONS + *> <* STORAGE + *> TYPE mytype = POINTERTORECORDeerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OFRECORDknal: CARDINAL; boem: POINTERTOARRAYOF 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 dynamischaangemaaktevariabelen (dmv NEW()) moetengedisposedworden! *) DISPOSE(p); ENDPointerIntro. • Pointers zijnadressen, geengeheugen!!! • Voordelen: • p enboemnemengeenplaats in, zolangernietexplicietgeheugenvoorwordtgereserveerd.
TOPIC O: Pointers MODULEPointerIntro; <* M2EXTENSIONS + *> <* STORAGE + *> TYPE mytype = POINTERTORECORDeerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OFRECORDknal: CARDINAL; boem: POINTERTOARRAYOF 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 dynamischaangemaaktevariabelen (dmv NEW()) moetengedisposedworden! *) DISPOSE(p); ENDPointerIntro. Pointers zijn adressen, geen geheugen!!! Eerst geheugen reserveren!
TOPIC O: Pointers MODULEPointerIntro; <* M2EXTENSIONS + *> <* STORAGE + *> TYPE mytype = POINTERTORECORDeerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OFRECORDknal: CARDINAL; boem: POINTERTOARRAYOF 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 dynamischaangemaaktevariabelen (dmv NEW()) moetengedisposedworden! *) DISPOSE(p); ENDPointerIntro. • Pointers zijnadressen, geengeheugen!!! • Eerstgeheugenreserveren! • Variabele: NEW(p)
TOPIC O: Pointers MODULEPointerIntro; <* M2EXTENSIONS + *> <* STORAGE + *> TYPE mytype = POINTERTORECORDeerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OFRECORDknal: CARDINAL; boem: POINTERTOARRAYOF 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 dynamischaangemaaktevariabelen (dmv NEW()) moetengedisposedworden! *) DISPOSE(p); ENDPointerIntro. • Pointers zijnadressen, geengeheugen!!! • Gebruiken • p^ => RECORD
TOPIC O: Pointers MODULEPointerIntro; <* M2EXTENSIONS + *> <* STORAGE + *> TYPE mytype = POINTERTORECORDeerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OFRECORDknal: CARDINAL; boem: POINTERTOARRAYOF 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 dynamischaangemaaktevariabelen (dmv NEW()) moetengedisposedworden! *) DISPOSE(p); ENDPointerIntro. • Pointers zijnadressen, geengeheugen!!! • Eerstgeheugenreserveren! • Open Array: NEW(x,Aantal_kotjes)
TOPIC O: Pointers MODULEPointerIntro; <* M2EXTENSIONS + *> <* STORAGE + *> TYPE mytype = POINTERTORECORDeerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OFRECORDknal: CARDINAL; boem: POINTERTOARRAYOF 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 dynamischaangemaaktevariabelen (dmv NEW()) moetengedisposedworden! *) DISPOSE(p); ENDPointerIntro. • Pointers zijn adressen, geen geheugen!!! • Open Array: VOORDELEN • Dynamisch aanmaken van geheugen • Mogelijk voor elke array een verschillende grootte te geven
TOPIC O: Pointers MODULEPointerIntro; <* M2EXTENSIONS + *> <* STORAGE + *> TYPE mytype = POINTERTORECORDeerste: CARDINAL; tweede: ARRAY[1..10],[1..10] OFRECORDknal: CARDINAL; boem: POINTERTOARRAYOF 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 dynamischaangemaaktevariabelen (dmv NEW()) moetengedisposedworden! *) DISPOSE(p); ENDPointerIntro. • Pointers zijn adressen, geen geheugen!!! • LET OP! • - Gereserveerd geheugen moet vrijgegeven worden: DISPOSE(..)
TOPIC O: Pointers • Pointers zijn adressen, geen geheugen!!! • Geheugen moet gereserveerd worden: NEW(…) • Geheugen moet vrijgegeven worden: • DISPOSE(…) MOGELIJKE PROBLEMEN:
TOPIC O: Pointers • 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 • 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 DISPOSE(p^.tweede[5][8].boem); DISPOSE(p); OK! • MEMORY LEAK: • DISPOSE(…) in de juiste volgorde!!!
TOPIC O: Pointers NIET OK! p is niet meer toegangelijk na DISPOSE boem kan niet meer verwijderd worden, want link is verdwenen MEMORY LEAK!!! DISPOSE(p); DISPOSE(p^.tweede[5][8].boem); • MEMORY LEAK: • DISPOSE(…) in de juiste volgorde!!!
TOPIC O: Pointers PROCEDUREaddToList(myList: ptrList); VAR temp: ptrList; BEGIN NEW(temp); temp.next := myList; ENDaddToList; VARfunnyList: ptrList; BEGIN …. addToList(funnyList); • MEMORY LEAK: • NEW() Zorg dat de link niet verdwijnt
TOPIC O: Pointers PROCEDUREaddToList(myList: ptrList); VAR temp: ptrList; BEGIN NEW(temp); temp.next := myList; ENDaddToList; VARfunnyList: ptrList; BEGIN …. addToList(funnyList); Geheugen reserveren • MEMORY LEAK: • NEW() Zorg dat de link niet verdwijnt
TOPIC O: Pointers PROCEDUREaddToList(myList: ptrList); VAR temp: ptrList; BEGIN NEW(temp); temp.next := myList; ENDaddToList; VARfunnyList: ptrList; BEGIN …. addToList(funnyList); Geheugen reserveren • Na oproep, funnyList = NIL • Geen link naargereserveerdgeheugen • MEMORY LEAK • MEMORY LEAK: • NEW() Zorg dat de link niet verdwijnt
TOPIC O: Pointers • 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 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); • Pointers zijn adressen, geen geheugen!!! • Geheugen moet gereserveerd worden: NEW(…) • Geheugen moet vrijgegeven worden: • DISPOSE(…)
TOPIC O: Pointers 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); Geheugen gereserveerd Item 3 Item 4 Item 2 Item 1
TOPIC O: Pointers 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); Geheugen vrij gegeven! Item 3 Item 4 Item 2 Item 1
TOPIC O: Pointers 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 3 Item 4 Item 2 Item 1 Item 5
TOPIC O: Pointers 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); Maar Item 4 = Item 5 in geheugen Item 3 Item 4 Item 2 Item 1 Item 5
TOPIC O: Pointers 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); Maar Item 4 = Item 5 in geheugen Item 3 Item 5 Item 2 Item 1
TOPIC O: Pointers 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); CORRUPT GEHEUGEN!!! Item 3 Item 5 Item 2 Item 1