1 / 27

TOPIC O: Pointers

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 …

adelio
Download Presentation

TOPIC O: Pointers

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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, …

  2. 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

  3. 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!!!

  4. 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?

  5. 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.

  6. 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!

  7. 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)

  8. 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

  9. 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)

  10. 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

  11. 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(..)

  12. TOPIC O: Pointers • Pointers zijn adressen, geen geheugen!!! • Geheugen moet gereserveerd worden: NEW(…) • Geheugen moet vrijgegeven worden: • DISPOSE(…) MOGELIJKE PROBLEMEN:

  13. 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!

  14. 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.

  15. TOPIC O: Pointers DISPOSE(p^.tweede[5][8].boem); DISPOSE(p); OK! • MEMORY LEAK: • DISPOSE(…)  in de juiste volgorde!!!

  16. 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!!!

  17. 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

  18. 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

  19. 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

  20. 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.

  21. 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(…)

  22. 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

  23. 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

  24. 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

  25. 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

  26. 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

  27. 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

More Related