Minnestilldelning (allokering) och frigörande (avallokering) av minne

Relevanta dokument
Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

*Pekarvärden *Pekarvariabler & *

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

2 Pekare och dynamiska variabler.

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

TDDC76 - Programmering och Datastrukturer

Föreläsning 5: Introduktion av pekare

TDDC76 - Programmering och Datastrukturer

Det finns många flaggor till g++,

Tommy Färnqvist, IDA, Linköpings universitet

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Föreläsning 10. Pekare (Pointers)

Programmering i C++ EDA623 Typer. EDA623 (Föreläsning 4) HT / 33

Övning från förra gången: readword

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

TDIU01 - Programmering i C++, grundkurs

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

Att använda pekare i. C-kod

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

grundläggande C++, funktioner m.m.

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00

KLASSER. Inkapsling Abstrakt datatyp Public och private. Klassmedlemmar Datamedlemmar Exempel Funktionsmedlemmar

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Föreläsning 11. Arrayer. Arrayer. Arrayer. Lagrar flera värden av samma typ Kan vara primitiva typer eller objekt. Kan ha en array av t.

int (*fp) (char, char*) //pekare till funktion som tar //argumenten (char, char*) och //returnerar int

Värmedistribution i plåt

Övningar Dag 2 En första klass

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Kapitel 6 - Undantag

Föreläsning 6 pekare och pekare tillsammans med arrayer

Dynamisk bindning och polymorfism

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

[] Arrayer = Indexerad variabel

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

F5: Högnivåprogrammering

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

F5: Högnivåprogrammering

Nedan skapar vi klassen Person innehållande datamedlemmar för förnamn, efternamn, ålder, längd och vikt:

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

TDDC76 Programmering och datastrukturer

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

Föreläsning 5-6 Innehåll

Objekt och referenser

Del3 Klassanvändning, operatorer och pekare Ämnesområden denna föreläsning:

Objektorienterad programmering Föreläsning 9. Copyright Mahmud Al Hakim Agenda (halvdag)

Omgivningar. Omgivningar är viktiga eftersom de avgör vilka namn som är synliga och därmed dessas innebörd och de värden som är förknippade med dem.

Objektorienterad programmering i Java

Introduktion till arv

Innehåll. Pekare Exempel

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Innehåll. Pekare Exempel

Poster ( structar ) Postdeklarationer

IS1200 Datorteknik. Övning CE_O4 Maskinnära programmering med C Förberedelser till hemlaboration 1

Innehåll. Resurshantering. Resource handles. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 6. Resurshantering

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Det objektorienterade synsättet. Objekt. Datorprogrammet kan uppfattas som en slags modell av den verklighet programmet skall samverka med.

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

1 Klasser och objektorientering Vad är objektorientering?

Imperativ programmering. Föreläsning 2

TDIU01 - Programmering i C++, grundkurs

SP:PROG3 HT12 Tenta

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

Objektorientering: Lagring och livstid

maxlist-1. Indexerad lista Länkad lista

TDDC76 - Programmering och Datastrukturer

Inledande programmering med C# (1DV402) 27+15=42 1 (22)

PROGRAMMERING-Java Omtentamina

Dagens föreläsning. Diverse Common Lisp. Konstanter, parametrar, globala variabler

TDDC77 Objektorienterad Programmering

Föreläsning REPETITION & EXTENTA

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Föreläsning 6: Introduktion av listor

Enkla datatyper minne

Motivation. Programmeringsuppgift: En första ansats: Lagra info om anställda Håll reda på varje anställds närmaste chef. som också är en anställd!

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Innehåll. Pekare Syntax

Programsystem konstruktion med C++ (2D1387) Innehåll. övning 2 klasser och arv

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Torsdag 7 januari 2016, 14:00-18:00

HI1024 Programmering, grundkurs TEN

C++ Lektion Tecken och teckenfält

Programmering B med Visual C

Innehåll. 1 Typdeklarationer och typomvandling 2 Resurshantering. 3 Objektorientering, kort repetition. 4 Klasser

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

C++-programmets beståndsdelar

Övning 4. Arv och andra relationer

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Övriga byggstenar. Övriga byggstenar. Några tips under programutveckling. Beroenden Pekare till funktioner Typkonvertering

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Filer och structer Del 2

Transkript:

Pekare i C++ Pekare används mycket i C++. De är bra både för att de tillåter dynamisk minnesallokering och för att de är referenser. En pekarvariabel innehåller en adress till ett element, den pekar på ett element. Därför kallas också pekare för referenser. De refererar till ett element. Pekare måste tilldelas/allokeras minne, det görs inte automatiskt. Då man tilldelar/allokerar minne till en pekare sker det dynamiskt, d v s då programmet körs. Allt minne som är statiskt allokerat tilldelas programmet innan körningen av programmet startar. Man måste också frigöra minnet för pekaren när det inte behövs längre. Med att frigöra eller avallokera minne menas att man lämnar tillbaka minnet till systemet. För att komma åt det som pekaren pekar på måste man avreferera den. Exempel 1 Pekare int* x; char* y; struct s* t; Person* p; // x är en pekare till en integer // y är en pekare till en character // t är en pekare till en struct s // p är en pekare till en person En pekare tilldelas inte minne till det den ska peka på när den skapas, vilket innebär att man måste tilldela/allokera minne manuellt. Exempel på hur det går till finns nedan. Minnestilldelning (allokering) och frigörande (avallokering) av minne Exempel 2 Minnestilldelning Minnestilldelning görs med det reserverade ordet new samt den typ, och eventuell storlek om det handlar om en array, man vill allokera. int* pek; pek = new int; *pek = 7; int x = *pek; int* y; y = new int[30]; // enbart en intpekare utan minne // minne för att lagra ett heltal allokeras // tilldela värdet 7 till den intplats som pek // pekar på. // tilldela en vanlig intvariabel det värde som // pek pekar på. // enbart pekare utan minne // minne för att lagra en array med 30 heltal // allokeras. // y pekar nu på en array av heltal // y pekar på den första platsen i arrayen. for(int i=0; i<30; i++) y[i]=i; // y:s värden sätts till värden

//motsvarande positionen Person* person_pekare = new Person Nisse( Nisse Nilsson, {6,8,0,9,2,2,7,7,5,1}); //person_pekare pekar på ett personobjekt med namn Nisse Exempel 3 Frigörande av minne För att frigöra minne som tidigare allokerats används kommandot delete. delete pek; pek = 0; // Ta bort det utrymme som associeras med pek // Sätt pekaren till 0 (null) så den inte // refererar till något delete[] y; // Ta bort det utrymme som associeras med y. // Observera att man måste använda [] efter // delete för att ta bort en array. y = 0; delete person_pekare; person_pekare = 0; // Ta bort det utrymme (objekt) som // associeras med person_pekare.

Fler exempel Exempel 4 Olika pekaroperationer typedef int* ptrtype; ptrtype p, ; p int x; x p = &x p x eller *p *p = 6; 6 p x eller *p p = new int; 6 x *p=7 7 6 x = p; 7 6 p *p eller * x = new int; 7 6 x *=8; 8 *

p = 0; 7 6 p x 8 * delete ; 7 6 p x = 0;

Exempel 5 Ytterligare exempel på pekare typedef int* ptrtype; 1. ptrtype p, ; p 2. p = new int; 3. *p = 1; 1 4. = new int; 1 * 5. * = 2; 1 cout << *p << << * << endl; ger utskriften: 1 2 2 * 6. *p = * + 3 ; 5 2 *

7. p = ; p 5 cout << *p << << * << endl; ger utskriften: 2 2 2 *p eller * 8. *p = 7; p 5 cout << *p << << * << endl; ger utskriften: 7 7 7 *p eller * 9. p = new int; 5 7 * 10. delete p; p = 0; = 0; p 5 7

Faror med pekare int* x, y; // ger en intpekare x och en int, y. int* x, *y; // ger två intpekare, x och y. Se upp med asterisken (*) eftersom den hör ihop med variabeln och inte med typen. OBS! Ta för vana att aldrig deklarera mer än en pekare på varje rad, då blir detta inget problem. Man får inte ta bort minne för en pekare som inte tilldelats något minne. Man får inte tilldela en pekare ett värde om den inte tilldelats något minne. char* char_pekare; *char_pekare = f ; delete char_pekare; //NEJ, NEJ, NEJ!!!!! //NEJ, NEJ, NEJ!!!!! double* double_pekare = new double; *double_pekare = 3.1415; //OK, det finns minne allokerat. delete double_pekare ; //OK, här finns det minne att ta bort. Tänk på att asterisken (*) används med två olika innebörder. Dels för att deklarera en pekare och dels för att komma åt det som pekaren pekar på. Sätt alltid pekaren till 0 (null) om den inte refererar till något vettigt. Det är lätt att glömma detta. int* int_pekare = new int; *int_pekare = 55; delete int_pekare; int_pekare = 0; // Sätt pekaren till 0 (null), den refererar // inte längre till något vettigt. Tänk på att alltid använda delete[]då du tar bort minne som allokerats som en array. int* array = new int[50]; delete[] array; array = 0;

Repetition av nyckelbegrepp int* p allokerar en pekarvariabel p med ett odefinierat värde. p kan peka till ett heltal. p = new int; allokerar en ny minnescell för heltal dynamiskt. p sätts att peka på denna minnescell. new är en operator som returnerar adressen till det allokerade minesutrymmet. Uttrycket *p refererar till den minnescell som p pekar på. Om pekarvariabeln p har värdet 0 (null) pekar den inte på någonting. delete p; återlämnar minnescellen som p pekar på till systemet. Pekaren p tas dock inte bort varför p måste sättas till 0 (null) efter operationen för att inte peka på en återlämnad minnescell. p = 0; Asterisken (*) används till två saker. Dels för att skapa pekaren och dels för att referera till den minnescell som pekaren pekar på.