30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

366 12. Operator Overload<strong>in</strong>g<br />

werden kann. Hat man nun z.B. e<strong>in</strong>en Po<strong>in</strong>ter, der auf e<strong>in</strong> Objekt zeigt, das<br />

<strong>in</strong> e<strong>in</strong>em solchen Speicherblock liegt, dann zeigt nach e<strong>in</strong>er Verschiebung des<br />

Blocks dieser Po<strong>in</strong>ter <strong>in</strong>s Nirvana. Welche lustigen Folgen das haben kann,<br />

lässt sich leicht vorstellen.<br />

Vorsicht Falle: Es wurde bereits implizit erwähnt, aber weil es derartig<br />

gefährlich ist, möchte ich es hier noch e<strong>in</strong>mal explizit anführen:<br />

• Die Funktion malloc allokiert nur Speicher. Sie weiß nichts von Objekten<br />

oder sonstigen C ++ Features. Es wird also bei Verwendung von malloc<br />

niemals e<strong>in</strong> Konstruktor aufgerufen.<br />

• Die Funktion free gibt nur Speicher frei. Auch sie weiß nichts von Objekten.<br />

Es wird also bei Verwendung von free niemals e<strong>in</strong> Destruktor<br />

aufgerufen.<br />

Das Schlimmste, was man machen kann (und ich habe so etwas bereits <strong>in</strong><br />

mehr als e<strong>in</strong>em C ++ Programm gesehen!), ist also Folgendes: Man legt e<strong>in</strong><br />

Objekt ordnungsgemäß mit new an. Anstatt allerd<strong>in</strong>gs das Objekt dann mit<br />

delete wieder freizugeben, ruft man free mit dem Base-Po<strong>in</strong>ter des Objekts<br />

auf. Dadurch wird ke<strong>in</strong> Destruktor aufgerufen und was das bedeutet, kann<br />

man sich ausmalen!<br />

Vorsicht Falle: Um den Blick nicht vom Wesentlichen abzulenken, habe<br />

ich im Beispiel den return-Value von malloc nicht überprüft. Die Funktion<br />

malloc ist allerd<strong>in</strong>gs gleich def<strong>in</strong>iert wie <strong>in</strong> C: Wenn der Speicher ausgeht,<br />

dann retourniert sie e<strong>in</strong>en 0-Po<strong>in</strong>ter! Diese Funktion weiß nichts von Exceptions<br />

und wirft dementsprechend selbsttätig ke<strong>in</strong>e bad_alloc Exception, wenn<br />

nicht mehr genug Speicher da ist.<br />

Aus diesem Grund muss bei e<strong>in</strong>er ernsthaften Implementation von new<br />

immer der return-Value von malloc abgefragt und entsprechend reagiert werden.<br />

Allerd<strong>in</strong>gs ist dies alle<strong>in</strong> bei e<strong>in</strong>er ernsthaften Implementation auch nicht<br />

genug! Per Konvention darf man nicht bl<strong>in</strong>dl<strong>in</strong>gs e<strong>in</strong>e bad_alloc Exception<br />

werfen, denn es gibt da noch e<strong>in</strong>e weitere Konvention <strong>in</strong> C ++, die man<br />

zu beachten hat. Wie man nun korrekt nach Standard die Behandlung von<br />

Speicherknappheit übernimmt, wird ausführlich <strong>in</strong> Abschnitt Verhalten bei<br />

“Ausgehen” des Speichers diskutiert.<br />

Der Vollständigkeit halber möchte ich an dieser Stelle auch noch erwähnen,<br />

dass bei Inkludieren von auch noch die aus C bekannten Funktionen<br />

memcpy, memmove, memchr, memcmp und memset zur Verfügung stehen.<br />

Und natürlich muss ich auch hier gleich vor deren unsachgemäßen Verwendung<br />

dr<strong>in</strong>gendst warnen.<br />

Nach diesem kurzen aber notwendigen Ausflug <strong>in</strong> die Welt der Low-Level<br />

Speicherverwaltung wird es Zeit zum eigentlichen Thema dieses Kapitels

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!