30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

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

aufgerufen, der sich z.B. auf e<strong>in</strong>en anderen Speicherbereich beziehen könnte –<br />

mit entsprechend fatalen Folgen. Wie lang man suchen kann, bis man e<strong>in</strong>en<br />

solchen Fehler <strong>in</strong> e<strong>in</strong>em verrückt gewordenen Programm f<strong>in</strong>det, kann man<br />

sich leicht ausmalen.<br />

12.3.3 Placement Operator new<br />

Neben den beiden new Operatoren für <strong>in</strong>dividuelle Objekte und für Arrays<br />

gibt es noch e<strong>in</strong>en dritten, den sogenannten Placement Operator new(). Bei<br />

diesem übergibt man noch zusätzlich als zweiten Parameter e<strong>in</strong>en Po<strong>in</strong>ter,<br />

der e<strong>in</strong>en H<strong>in</strong>weis darauf gibt, wo der Speicher allokiert werden soll.<br />

Nehmen wir am besten e<strong>in</strong>e kle<strong>in</strong>e Änderung an unserem Beispiel vor,<br />

um zu sehen, was dieser Operator bietet und wie man mit ihm umgeht<br />

(third_new_delete_overload<strong>in</strong>g_demo.cpp). Die erste Änderung betrifft<br />

den MemoryProvider: Anstatt nur statische Methoden zur Verfügung zu stellen,<br />

muss man nun e<strong>in</strong>e Instanz erzeugen. Die Verwendung ist so gedacht,<br />

dass man für jeden spezifischen Teil des Memories e<strong>in</strong>e eigene Instanz hat.<br />

Bei uns also e<strong>in</strong>e für den schnellen und e<strong>in</strong>e für den nicht flüchtigen Teil des<br />

Memories. Die umgeschriebene Klasse liest sich dann so:<br />

24 class MemoryProvider<br />

25 {<br />

26 public :<br />

27 // u s u a l l y the constructor has a parameter f o r the s t a r t<br />

28 // address of the managed pool , the s i z e , etc . . . but f o r<br />

29 // demo purposes I don ’ t want to write a ” r e a l ” memory<br />

30 // management c l a s s . So i t ’ s j u s t a dummy . . .<br />

31 MemoryProvider ( ) { } ;<br />

32<br />

33 void ∗ allocMemBlock ( s i z e t s i z e )<br />

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

35<br />

36 void freeMemBlock ( void ∗ base ptr )<br />

37 throw ( ) ;<br />

38 } ;<br />

Die Implementationen der beiden Methoden zum Allokieren und Freigeben<br />

s<strong>in</strong>d <strong>in</strong> unserem Demoprogramm wieder re<strong>in</strong>e Dummies, die mit malloc und<br />

free geschrieben s<strong>in</strong>d. Deshalb erspare ich mir das Abdrucken derselben an<br />

dieser Stelle.<br />

Anstatt zwei verschiedene Klassen, e<strong>in</strong>e für das schnelle und e<strong>in</strong>e für das<br />

langsame Memory zu haben, brauchen wir hier nur noch e<strong>in</strong>e e<strong>in</strong>zige Klasse,<br />

denn beim Aufruf von new wird jetzt e<strong>in</strong> Po<strong>in</strong>ter auf die gewünschte Instanz<br />

des Memory Managers mitgegeben. Also haben wir es hier mit der Klasse<br />

SpecialMemoryManagedObject zu tun:<br />

49 class SpecialMemoryManagedObject<br />

50 {<br />

51 private :<br />

52 // f o r b i d standard i n s t a n t i a t i o n

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!