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.

266 10. Memory – e<strong>in</strong> kle<strong>in</strong>es Beispiel<br />

z.B. zwei Elemente im Vektor vertauschen will? Man ruft getElementAt<br />

für das erste Element auf und merkt sich den retournierten Po<strong>in</strong>ter. Dann<br />

ruft man getElementAt für das zweite Element auf, um es gleich wieder mit<br />

setElementAt an die Stelle des ersten Elements zu schreiben. Dann schreibt<br />

man das zwischengespeicherte erste Element an die Stelle, an der vorher das<br />

zweite Element stand. Und dann sucht man beim nächsten Zugriff auf e<strong>in</strong>es<br />

der beiden Elemente ziemlich lange nach e<strong>in</strong>er völlig unerklärbaren Segmentation<br />

Violation...<br />

In diesem Beispiel wird nämlich bei den beiden setElementAt Operationen<br />

von der Vektor Klasse das jeweils vorher dort gespeicherte Element<br />

durch e<strong>in</strong>en entsprechenden Deletor Aufruf über den Jordan geschickt! Woher<br />

sollte der Vektor denn auch ahnen, dass wir die Elemente auch wirklich<br />

nicht “verlieren”? Um dieses Problem <strong>in</strong> den Griff zu bekommen, wurde die<br />

Methode getAndRemoveElementAt e<strong>in</strong>geführt, die das gelieferte Objekt aus<br />

dem Vektor entfernt, <strong>in</strong>dem an diese Stelle e<strong>in</strong> 0 Po<strong>in</strong>ter gesetzt wird.<br />

10.2.4 ObjectDeletor<br />

Das allgeme<strong>in</strong>e Interface für e<strong>in</strong>en ObjectDeletor ist denkbar e<strong>in</strong>fach, wie<br />

man <strong>in</strong> der Folge sieht:<br />

1 // o b j e c t d e l e t o r . h − the i n t e r f a c e f o r an o b j e c t d e l e t o r<br />

2 // as i t i s used by the simple vector c l a s s<br />

3<br />

4 #ifndef o b j e c t d e l e t o r h<br />

5 #def<strong>in</strong>e o b j e c t d e l e t o r h<br />

6<br />

7 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

8 /∗ The i n t e r f a c e f o r an o bject d e l e t o r<br />

9 ∗/<br />

10<br />

11 class ObjectDeletor<br />

12 {<br />

13 public :<br />

14 /∗ Destructor<br />

15 ∗ Just to make sure that a v i r t u a l d e s t r u c t o r e x i s t s<br />

16 ∗/<br />

17 virtual ˜ ObjectDeletor ( ) { }<br />

18<br />

19 /∗ I s c a l l e d with a po<strong>in</strong>ter to the o b j e c t and has to d e l e t e<br />

20 ∗ i t . Please note that i t can a l s o happen that a 0 po<strong>in</strong>ter<br />

21 ∗ i s given as a parameter<br />

22 ∗ @param obj The po<strong>in</strong>ter to the o b j e c t that has to be deleted<br />

23 ∗/<br />

24 virtual void deleteObject ( void ∗ obj ) = 0 ;<br />

25 } ;<br />

26<br />

27 #endif // o b j e c t d e l e t o r h

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!