De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

TOPIC O: Pointers | pag. 1 Pointer = adres in het geheugen, is zelf geen geheugen! Expliciet geheugen aanvragen vóór gebruik.

Verwante presentaties


Presentatie over: "TOPIC O: Pointers | pag. 1 Pointer = adres in het geheugen, is zelf geen geheugen! Expliciet geheugen aanvragen vóór gebruik."— Transcript van de presentatie:

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

2 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

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

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

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

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

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

8 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

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

10 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

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

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

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

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

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

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

17 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

18 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

19 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

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

21 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);

22 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

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

24 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

25 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

26 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

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


Download ppt "TOPIC O: Pointers | pag. 1 Pointer = adres in het geheugen, is zelf geen geheugen! Expliciet geheugen aanvragen vóór gebruik."

Verwante presentaties


Ads door Google