TDP004 Objektorienterad Programmering Fö 5 Minneshantering.

Slides:



Advertisements
Liknande presentationer
Föreläsning 9 Programmeringsteknik och Matlab 2D1312/2D1305
Advertisements

Interface.  Interface är en datatyp och har alltså egen syntax och en hel del egna regler för vad arv från interface innebär.  Interface är renodlad.
Avlusning Debugger (”avlusare”) Breakpoints Watch.
Anders Sjögren Lagringsklasser •en variabel i C har två attribut –type( int, float, char..... ) –lagringsklass( auto, extern, register, static ) •lagringsklassens.
Klasser och objekt.
Algoritmer och data strukturer -Länkade listor
Föreläsning 1.
C-programmering ID120V William Sandqvist Länkad lista
Objektorienterad tänkande
Polymorfism.
Programmeringsteknik för K och Media
Föreläsning 13 Allt om tentan. Sistaminutenhjälp: På fredag 17 december kl 12 sitter Linda i kemi-fiket och svarar på frågor.
Föreläsning 6 Referenser Objekt som parametrar public/private Klassvariabler och klassmetoder.
1 Föreläsning 6 Klass Object, instans av klass public/private Klassvariabler och klassmetoder.
Alice in Action with Java
i olika programmeringsspråk
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Objektbaserad programmering –Grundläggande om klasser och objekt – (Arv får vänta)  Iden med klasser.
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Konstruktor Ser till att objektets data är korrekt initierade MinKlass::MinKlass(); MinKlass::MinKlass(int.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Klasser och instansvariabler -Tabeller av klassobjekt.
Föreläsning 11 Arrayer.
Sid 1 CD5250 OOP med C++ Daniel Flemström MDH/IDT CD5250 OOP med C++
Programmering i C# 3. Klasser.
PROCESSPROGRAMMERING
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 6 ( ) INNEHÅLL: -Mera om tabeller.
Pekare och speciell programstruktur i inbyggda system
Pointers. int a=5; int f(int b) { a--; b++; return b; } int main() { int a=3; printf("%d,",f(a)); printf("%d",a); return 0; }
Programmering B PHP Lektion 2
int res2=Math.max(tal1,tal2);
4. Arv och dynamisk bindning
Vektorer (klassen Vector) Sortering
Mer om arv - Polymorfism Kursbok: “Objects First with Java - A Practical Introduction using BlueJ”, David J. Barnes & Michael Kölling Fredric Ragnar
Programmering i C# 5. Structer.
Programmeringsteknik för Media1 & K1
William Sandqvist C:s minnesmodell.
1. En infrastruktur för programutveckling
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Klasser -Att definiera egna klasser -Klassvariabler -Klassmetoder.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 8 ( ) INNEHÅLL:Klasser: -Konstruktorer -Klassvariabler -Instansmetoder -Privata.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Metoder -Lokala variabler -Mera om klasser: -Nyckelorden.
Riktade listor i C och Java Lösning till gruppövning 1.
1 Föreläsning 6 Programmeringsteknik och Matlab 2D1312/2D1305 Metoder & parametrar Array API och klassen ArrayList.
Programmering i C# 9. Pekare och osäker kod.
Föreläsning 1. Innehåll Introduktion till objektorientering –OOP (objektorienterad programmering) –Objekt, instanser, klasser C++ –OO i C++ –Standardbibliotek.
För utveckling av verksamhet, produkter och livskvalitet. Stack och Kö - Implementering - Tilllämpningar.
Föreläsning 12 Om slutprovet. Repetition –deklaration av variabler –skapande av objekt (instansiering) –Vektorer och Vector-klassen –Klasser –Instans-/klassvariabler.
F. Drewes, Inst. f. datavetenskap1 Föreläsning 8: Underprogram Underprogram Räckvidd Parameteröverföring.
Stack och Kö -Implementering -Tilllämpningar -- Kapitel 16, 11.
F. Drewes, Inst. f. datavetenskap1 Föreläsning 2: Variabler och datatyper Variabler Bindning Typkontroll Några viktiga datatyper.
INTRODUKTION TILL PROGRAMMERING
Objektorienterad programmering
Föreläsning 2. Allmänt STL genererar varningar i Visual C++ –”#pragma warning (disable : 4786)”
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Undantag - eng. Exceptions Viktig del av klassbiblioteksdesign “Hoppa direkt ut med felkod” class.
7. Delegerare och notifierare
Lennart Edblom & Frank Drewes, Inst. f. datavetenskap 1 Föreläsning 2: Variabler och datatyper Variabler Bindning Typkontroll Några viktiga datatyper.
OOP F5:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 5 Klasser och objekt Skapa objekt - new Referenser Konstruktorer Inkapsling.
Övning2 programmeringsteknik och Matlab 2D1312/ 2D1305
Programmeringsteknik för K och Media
Anders Sjögren Data (i primärminnet) som en länkad lista datatypen för varje element i listan är en struktur, post ( struct )
1 Föreläsning 6 Repetition på metoder Referenser Objekt som parametrar public/private Klassvariabler och klassmetoder.
Program indata ? utdata 1/20 Vahid Mosavat, Nada, KTH.
1 Föreläsning 4 Metoder & parametrar Array API och klassen ArrayList.
Objektbaserad programmering sid. 1 6/30/2015CD5250 OOP med C++ Mats Medin MDH/IDT Objektbaserad programmering –Grundläggande om klasser och objekt – (Arv.
Objektorienterad programmering sid. 1 7/15/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Objektorienterad programmering OOP = objektbaserad programmering.
TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder.
1 Mer om metoder, variabler, klasser och objekt. Kursboken: - Kapitel 6 - Kapitel 8.
Python.
TDP004 Objektorienterad Programmering Fö 6 Objektorientering forts.
TDP004 Objektorienterad Programmering Fö 8 Sammanfattning
Detaljer i exception-hantering
Objektorienterad programmering forts
Föreläsning 8: Exempel och problemlösning
Presentationens avskrift:

TDP004 Objektorienterad Programmering Fö 5 Minneshantering

Introduktion Vi har tidigare nämnt dynamisk minneshantering i Fö 2. Pekare och referenser. Allokera minne och skapa objekt mha new, lämna tillbaka minne och ta bort objekt med delete. struct som alternativ till class enum för uppräkningstyper.

Pekare * ”A pointer points to an object” STL-iteratorer som vi såg i Fö 3 är en specialisering av pekarbegreppet. Pekare används bla för dynamisk minneshantering. Ex: int* p1; float* p2; vector * vp;/* vp är en pekare till en vector som innehåller element av typen pekare till int. */ ExampleClass* myClass = new ExampleClass();

Pekare *, forts. En pekare måste inte, men bör initieras. Man kan kontrollera om en pekare är giltig genom jämförelse med NULL. NULL är en preprocessorvariabel med värdet 0. if(p1 != NULL)//Vi kan även skriva if(p1 != 0) { //Förhoppningvis giltig pekare. }

Pekare och const const float pi = f; float e = f; const float * piPointer= π piPointer pekar på konstanten pi. float * const ePointer = &e; ePointer är const och pekar på variabeln e. const float * const newPiPointer = π newPiPointer är const och pekar på konstanten pi Läs från höger till vänster!

Använda pekare Om man har en pekare till ett objekt och vill anropa dess funktioner används notationen: variabelnamn->funktionsnamn(parametrar) Ex: ExampleClass* myClass = new ExampleClass(); myClass->func(1.1, 3.5, 5.7); Ex: Läser medlemsvariabel med liknande syntax. int id = myClass->m_ID;

Referens & Alternativ till pekare. Vi har använt referenser i Fö 1: ”Referensöverföring – call by reference int max(int& a,int& b) a och b refereras direkt, inga kopior skapas” Med referenser kan vi undvika att data kopieras i onödan.

Referens &, forts. ”A reference is an alias” En referens måste initieras. int i = 1; int& intRef = i;//intRef refererar nu till i. All operationer på en referens är egentligen operationer på den underliggande objektet. ”A reference is just another name for an object”

Referens &, forts. En referens får inte vara ogilitig. Det går inte att kontrollera om en referens är giltig.

Använda referenser Om man har en referens till ett objekt kan man anropa dess funktioner med variabelnamn.funktionsnamn(parametrar) Ex: ExampleClass myClass2 = &myClass; myClass2.func(1.1, 3.5, 5.7); Ex: Läser medlemsvariabel med liknande syntax. int id = myClass.m_ID;

Minneshantering Hur man skapar nya objekt och tar bort gamla objekt. Minneshantering står för en stor del av felen i programmen, genom att begära för mycket/lite minne och att inte lämna tillbaka det korrekt. Vi löser en stor del av dessa problem genom användning av STLs containerklasser.

Allokera med new En instans av ett objekt kan skapas med kommandot new: ExampleClass* myClass = new ExampleClass(); En instans kan skapas utan att använda new/pekare. ExampleClass m_Class = ExampleClass(); Man bör (men nästan ingen gör det) kontrollera resultatet av new. Det kan hända att new misslyckas med att allokera minne till objektet. Om new misslyckas att allokera minne så kommer std::bad_alloc exception att kastas.

Ta bort med delete En instans av ett objekt tas bort med kommandot delete: delete myClass; myClass = NULL; myClass borttagen och allt minne har lämnats tillbaka (om destruktorn i ExampleClass är korrekt). Dessutom kan man kontrollera om myClass är borttagen genom: if(myClass == NULL) { … } delete myClass; /* Garanterat att det inte kraschar om myClass = NULL. */

Minneshantering C++ har tre olika sorters minneshantering: Statiskt minne –Globala och namespace-variabler, static variabler. Automatiskt minne/stack –Funktionsargument och lokala variabler. Free store/heap –Allokeras med new.

Statiskt minne Variabler som är static, globala eller namespace-variabler allokeras automatiskt. ”Finns så länge du behöver dem”

Automatiskt minne / stack Ex: funktionsargument och lokala variabler i funktioner. Skapas och tas bort automatiskt. Automatiskt minne sägs ”vara på stacken”. När en funktion anropas skapas utrymme på stacken, sk ”stack frame”. När funktionen returnerar tas ”stack frame” för den returnerande funktionen bort. Vi bör inte returnera referenser till lokala variabler.

Free store / heap Alla program har en heap (free store area) för minne. När en variabel skapas med new allokeras minne på heapen. Det är på heapen minnesläckorna finns. Ex på minnesläcka: Test::TestExampleClass() { ExampleClass* classPointer = new ExampleClass(); classPointer->DoSomething(…) } –delete classPointer fattas. –Minnet som allokerats med new kommer att läcka.

Minnesregel Vi behöver enbart ta bort minne med delete om vi har allokerat det med new. Vanliga variabler, vector, list etc tas bort automatiskt. Om vi istället hade använt gammaldags arrayer [] vilket allokeras med new måste denna tas bort i destruktorn/slutet av funktionen för lokala variabler.

Översiktlig bild över minnet kod statiskt minne stack heap Stacken växer neråt med ökande antal ”stack frames”. Heapen växer uppåt med mera dynamiskt allokerat minne.

struct Som alternativ till class finns även struct som alternativ att skapa objekt. Skillnaden är att alla funktioner/variabler i en struct har public tillgänglighet som default, medan den är private i class. Struct är lämpligt för mindre dataposter där allt ska vara offentligt. –Möjligt att specificera åtkomst på samma sätt som för class. Annars brukar class användas. I övrigt fungerar struct på samma sätt som class.

enum enum möjliggör uppräkningstyper. Exempel: Definiera färger på kort i en kortlek. enum CardSuite { Clubs, Diamonds, Spades, Hearts };

enum, exempel struct Card { Card(CardSuite suite, CardValue value) : m_suit(suite), m_value(value) { } const CardSuite m_suite; const CardValue m_value; }; Direkta jämförelser mellan enum-variabler möjliga. Card a = Card(Clubs, Two); Card b = Card(Hearts, Three); if (a.m_value > b.m_value) { … }

enum, forts. Varje värde i en enum har ett numeriskt värde. Olika enum kan ha samma värde. Detta kan definieras av användaren. Om det numeriska värdet ej definieras börjar det med 0 för den första värdet o.s.v.

Kort om exceptions exception = exceptionell händelse, allvarligt fel Exempel ExampleClass* myClass = NULL; try { myClass = new ExampleClass(); } catch(std::bad_alloc e)//Fånga endast bad_alloc { //Hantera std::bad_alloc här. } catch(…) fångar alla sorters exception Med throw() kan programmeraren kasta exceptions

Sammanfattning Pekare, *, -> notation. Referens, &,. notation. Skapa objekt med new. Ta bort objekt med delete. struct är ett alternativ till class, för mindre dataposter där all data ska vara offentlig. enum för uppräkningar.