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.

12.3 Speicherverwaltung 371<br />

längere Zeit speichern. Das ist bei lokalen Variablen sowieso nicht der Fall,<br />

also betrifft uns dies nicht. Sehr wohl würde es uns betreffen, wenn wir<br />

e<strong>in</strong>fach e<strong>in</strong>e Variable mit globaler Lifetime anlegen wollten und diese im nicht<br />

flüchtigen Speicher zu liegen kommen sollte. In diesem Fall ist es dann so,<br />

dass entweder die Compiler/L<strong>in</strong>ker Komb<strong>in</strong>ation für unser System sowieso<br />

das static Memory im nicht flüchtigen Teil verewigt oder wir eben e<strong>in</strong>fach per<br />

Konvention nur mittels dynamischer Memory-Verwaltung arbeiten dürfen.<br />

12.3.2 Array new und delete<br />

Es ist bereits bekannt, dass es verschiedene new und delete Operatoren gibt,<br />

je nachdem, ob man e<strong>in</strong> e<strong>in</strong>zelnes Objekt oder e<strong>in</strong> Array von Objekten anlegen<br />

will. Genau diese Unterscheidung trifft uns auch beim Overload<strong>in</strong>g<br />

dieser Operatoren, denn für Arrays gibt es tatsächlich explizit die alternativen<br />

Operatoren new[] und delete[]. Man sieht also, dass der Aufruf<br />

von delete[] statt delete für Arrays nicht nur re<strong>in</strong>e Kosmetik ist, sondern<br />

dass sich dah<strong>in</strong>ter sehr wohl e<strong>in</strong> eigener, separater Operator mit besonderen<br />

Eigenschaften verbirgt. Ergänzen wir also unser Beispielprogramm um<br />

die entsprechenden Array-Operatoren um zu sehen, wie sich diese verhalten<br />

(second_new_delete_overload<strong>in</strong>g_demo.cpp). Die geänderte Klasse<br />

FastAccessibleObject sieht dann folgendermaßen aus:<br />

48 class FastAccessibleObject<br />

49 {<br />

50 public :<br />

51 void ∗ operator new( s i z e t s i z e )<br />

52 throw( b a d a l l o c ) ;<br />

53<br />

54 void ∗ operator new [ ] ( s i z e t s i z e )<br />

55 throw( b a d a l l o c ) ;<br />

56<br />

57 void operator delete ( void ∗ base ptr )<br />

58 throw ( ) ;<br />

59<br />

60 void operator delete [ ] ( void ∗ base ptr )<br />

61 throw ( ) ;<br />

62<br />

63 FastAccessibleObject ( ) { }<br />

64<br />

65 virtual ˜ FastAccessibleObject ( ) { }<br />

66 } ;<br />

Die Implementation der beiden dazugekommenen Operatoren birgt nichts<br />

wirklich Berauschendes, wie sich leicht erkennen lässt:<br />

169 void ∗ FastAccessibleObject : : operator new [ ] ( s i z e t s i z e )<br />

170 throw( b a d a l l o c )<br />

171 {<br />

172 cout

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!