• Keine Ergebnisse gefunden

Speicherverwaltung - Variablen & Zeiger

N/A
N/A
Protected

Academic year: 2022

Aktie "Speicherverwaltung - Variablen & Zeiger"

Copied!
18
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Crashkurs C++ - Teil 1

• Intro

• Speicherverwaltung

– Variablen, Pointer, Referenzen – Felder

– statische & dynamische Allozierung

(2)

Intro

• C++ ist die objektorientierte Weiterentwicklung von C

• C++ ist maschinennah implementiert

→ direkte Manipulation des Speichers möglich !!!

C++ erfordert eine explizite Speicherverwaltung (keine garbage collection!)

• hohe Flexibilität (aber auch höhere Komplexität. . . ) durch – Pointer-Datentyp

– Mehrfachvererbung – Templates

Angewandte Bildverarbeitung, WS 2003-2004 ⇐ ⇐▲ ▼ ⇒ ⇒ 1

(3)

Speicherverwaltung

Der Kern des Ganzen:

C++ unterscheidet zwischen einer Variablen und ihrer Position im Speicher

• daraus folgen grundsätzlich 3 Arten von Variablen-/Objekt-Datentypen:

– einfache Variablen beliebigen Typs, z.B. int, double, bool – Zeigervariablen bestimmten Typs, z.B. int*, double*, bool*

– Referenzen auf Variablen bestimmten Typs, z.B. int&

int a; // Variable des Typs Integer

int* z; // Variable des Typs "Zeiger auf Integer"

(4)

Speicherverwaltung - Variablen & Zeiger

Beispiel:

Angewandte Bildverarbeitung, WS 2003-2004 ⇐ ⇐▲ ▼ ⇒ ⇒ 3

(5)

Speicherverwaltung - Variablen & Zeiger

Beispiel:

• Variable x vom Typ T:

T x;

x = 50;

(6)

Speicherverwaltung - Variablen & Zeiger

Beispiel:

• Variable x vom Typ T:

T x;

x = 50;

Angewandte Bildverarbeitung, WS 2003-2004 ⇐ ⇐▲ ▼ ⇒ ⇒ 3

(7)

Speicherverwaltung - Variablen & Zeiger

Beispiel:

• Variable x vom Typ T:

T x;

x = 50;

• Variable z vom Typ ”Zeiger auf T”:

T* z;

• z zeigt an, wo eine Variable im Speicher steht

(8)

Speicherverwaltung - Variablen & Zeiger

Beispiel:

• Variable x vom Typ T:

T x;

x = 50;

• Variable z vom Typ ”Zeiger auf T”:

T* z;

• z zeigt an, wo eine Variable im Speicher steht

• Zuweisung einer Adresse an z mit &:

z = &x;

Angewandte Bildverarbeitung, WS 2003-2004 ⇐ ⇐▲ ▼ ⇒ ⇒ 3

(9)

Speicherverwaltung - Variablen & Zeiger

Beispiel:

• Variable x vom Typ T:

T x;

x = 50;

• Variable z vom Typ ”Zeiger auf T”:

T* z;

• z zeigt an, wo eine Variable im Speicher steht

• Zuweisung einer Adresse an z mit &:

z = &x;

• Zugriff auf Inhalte von x per Dereferenzierung *:

*z liefert 50

(10)

Speicherverwaltung - Variablen & Zeiger

Beispiel:

• Variable x vom Typ T:

T x;

x = 50;

• Variable z vom Typ ”Zeiger auf T”:

T* z;

• z zeigt an, wo eine Variable im Speicher steht

• Zuweisung einer Adresse an z mit &:

z = &x;

• Zugriff auf Inhalte von x per Dereferenzierung *:

*z liefert 50

• wird x verändert, ändert sich nur *z, z selbst nicht!

x = 40;

*z = 40;

Angewandte Bildverarbeitung, WS 2003-2004 ⇐ ⇐▲ ▼ ⇒ ⇒ 3

(11)

Speicherverwaltung - Referenzen

eine Referenz ist ein Alias für eine Variable

Referenzen sind immer mit schon existierenden Variablen verknüpft

→ Initialisierung direkt bei der Deklaration !

int& a; // geht nicht, Referenz uninitialisiert int b;

int& a = b; // ok, a verweist auf b

• jede Änderung wirkt sich jeweils auf Variable und Referenz aus

• wird die Variable gelöscht, wird auch die Referenz ungültig (Achtung bei Rückgabewerten von Funktionen!!!)

(12)

Speicherverwaltung - Pointer-Arithmetik

Pointer-Arithmetik

• Zeigervariablen sind Variablen mit besonderem Inhalt

• nutzbar wie jede andere Variable

⇒ insbesondere auch in arithmetischen Berechnungen

”Pointerarithmetik: Fluch und / oder Segen von C / C++”

effizienter Speicherzugriff vs. Sicherheit / Robustheit

int a = 42;

int* z = &a;

z = z + 3; // springe 3 Positionen weiter im Speicher !!!

(*z) --> ???!

Angewandte Bildverarbeitung, WS 2003-2004 ⇐ ⇐▲ ▼ ⇒ ⇒ 5

(13)

Speicherverwaltung - Arrays

Anwendungsbeispiel für Zeigervariablen: Felder (Arrays)

• ein Array entspricht einer Menge von linear hintereinander angeordneten Speicheradressen

int array[10]; // Feld der Groesse 10 fuer 10 Integerwerte feld[0]; // Zugriff auf das erste bzw. sechste Feld feld[5];

• Zugriff auf einzelne Elemente mit dem ”[ ]”-Operator

• Arrays und Pointer sind gewissermaßen dual

(14)

Speicherverwaltung - Arrays

• ein Feldbezeichner entspricht einem Zeiger auf die Anfangsadresse eines Speicherbereichs

int feld[10];

int* z = feld;

• der ”[ ]”-Operator ist damit Derefenzierungs-Operator

feld[0] == *z

feld[5] == *(z+5)

Angewandte Bildverarbeitung, WS 2003-2004 ⇐ ⇐▲ ▼ ⇒ ⇒ 7

(15)

Speicherverwaltung - Allokation

C++ unterscheidet 2 Arten der Speicherverwaltung / -allokation:

statisch:

Speicher wird vom Programm automatisch reserviert und wieder freigegeben

dynamisch:

Speicher wird explizit zur Laufzeit alloziert und freigegeben Dynamische Allokation ist notwendig, wenn

• der Speicherbedarf zur Compile-Zeit unbekannt ist

• Objekte global sichtbar sein sollen

(16)

Speicherverwaltung - Allokation

Grundidee:

• fordere explizit Speicher an und verwalte diesen über Zeiger

• Operatoren:

– new : reserviert Speicher für ein Objekt / eine Variable T* new T();

– delete : gibt reservierten Speicher wieder frei void delete(T*);

helloWorldClass* h;

h = new helloWorldClass();

h->sayHello(); // ok, Speicher wurde alloziert

delete h; // nie vergessen!!!

Angewandte Bildverarbeitung, WS 2003-2004 ⇐ ⇐▲ ▼ ⇒ ⇒ 9

(17)

Speicherverwaltung

• wenn ein allozierter Bereich nicht mehr referenziert wird, gibt es Speicherlecks....

void alloziereSpeicher() {

helloWorldClass* h= new helloWorldClass(); // Speicherleck!!!

}

int main(int argc, char **argv) { // die main-Funktion alloziereSpeicher();

};

• Faustregel:

zu jedem new im Programm muss es ein korrespondierendes delete geben!

Besonderheit: Allokation von Speicher für Felder

Operatoren: new [ ] und delete [ ]

(18)

Literatur

Weiterführende Literatur:

• Einführungsskript:

”C++ für Java-Programmierer” (Skript der Technischen FH Berlin)

• Bjarne Strousstrup, ”Die C++ Programmiersprache”, die Bibel für C++-Programmierer

• Prinz, Prinz, ”Objektorientierte Programmierung mit C++”

• Lippman, ”C++ Primer”

• Scott, Meyers, ”(Mehr) Effizient C++ programmieren”

. . . ansonsten gilt: ”Versuch macht klug”

Angewandte Bildverarbeitung, WS 2003-2004 ⇐ ⇐▲ ▼ ⇒ ⇒ 11

Referenzen

ÄHNLICHE DOKUMENTE

Mixed (Steigungsschwelle = 0.0001) 2.9 17.2 Mixed (Steigungsschwelle = 0.0002) 6.3 34.4 Mixed (Steigungsschwelle = 0.0008) 17.1 24.2. Max Queue

Perioden oder komplexere zusammenhänge (intertemporale Umwelt- schäden) sein. So ist bei nicht erneuerbaren natürlichen Res- sourcen die Ressourcenrestriktion dadurch

[r]

Ieber l3egriUe. Tstbedto- llowüel; Hendel5Ve.rhbr %Wisdlen dar Bundes:e.publlk und de.r TS<hecboslowaket für die Zelt vom 1. I.. 5.2 Olfentlic:be Bekanntmachung

For the first time, Clara provides a uniform way to (1) specify runtime monitors as annotated AspectJ aspects, and (2) integrate novel static typestate analyses.. During the process,

Im allgemeinen interessiert man sich aber nicht für die Laufzeit oder den Speicherplatz eines Programms für konkrete Eingaben – die tabellarische Auflistung von Laufzeit

Lege einen speziellen Speicherbereich für jeden Aufruf einer Funktion an. In sequentiellen Programmiersprachen können diese Speicherbereiche auf dem Keller

Oft ist zu dem Zeitpunkt, an dem ein Programm geschrieben wird, noch nicht klar, wieviele Daten zu verwalten sind: sollen 100 B¨ucher oder 1.000.000 B¨ucher gespeichert werden.. Da