27
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

  • Upload
    adelio

  • View
    29

  • Download
    0

Embed Size (px)

DESCRIPTION

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 … - PowerPoint PPT Presentation

Citation preview

Page 1: TOPIC O: Pointers

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

Page 2: TOPIC O: Pointers

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

Page 3: TOPIC O: Pointers

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

Page 4: TOPIC O: Pointers

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?

Page 5: TOPIC O: Pointers

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.

Page 6: TOPIC O: Pointers

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!

Page 7: TOPIC O: Pointers

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)

Page 8: TOPIC O: Pointers

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

Page 9: TOPIC O: Pointers

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)

Page 10: TOPIC O: Pointers

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

Page 11: TOPIC O: Pointers

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

Page 12: TOPIC O: Pointers

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:

Page 13: TOPIC O: Pointers

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!

Page 14: TOPIC O: Pointers

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.

Page 15: TOPIC O: Pointers

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

Page 16: TOPIC O: Pointers

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

Page 17: TOPIC O: Pointers

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

Page 18: TOPIC O: Pointers

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

Page 19: TOPIC O: Pointers

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

Page 20: TOPIC O: Pointers

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.

Page 21: TOPIC O: Pointers

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

Page 22: TOPIC O: Pointers

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

Page 23: TOPIC O: Pointers

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!

Page 24: TOPIC O: Pointers

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

Page 25: TOPIC O: Pointers

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

Page 26: TOPIC O: Pointers

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

Page 27: TOPIC O: Pointers

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