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 389<br />

bedeutet, dass wir durch Overload<strong>in</strong>g der globalen Operatoren ausschließlich<br />

die Verwaltung des Speichers für Objekte übernehmen können, deren Klassen<br />

selbst noch ke<strong>in</strong>e besondere Speicherverwaltung implementieren.<br />

Vorsicht Falle: Da die globalen Operatoren nur dann herangezogen werden,<br />

wenn e<strong>in</strong>e Klasse nicht bereits selbst die entsprechenden new und delete<br />

Operatoren implementiert, hat das Austauschen der Speicherverwaltung für<br />

e<strong>in</strong> gesamtes Programm nach dieser Methode mit äußerster Umsicht zu geschehen.<br />

Sonst kann es leicht zu sehr unangenehmen Interferenzen kommen,<br />

sollten die Pr<strong>in</strong>zipien der beiden Speicherverwaltungsalgorithmen nicht kompatibel<br />

zue<strong>in</strong>ander se<strong>in</strong>!<br />

Besonders bösartig wird dieser Fehler, wenn z.B. e<strong>in</strong>e Klasse, aus welchen<br />

Gründen auch immer, nur die new Operatoren implementiert, aber delete<br />

dem System überlässt. Dann passiert nämlich der Fall, dass das klassen<strong>in</strong>terne<br />

new und als Gegenstück dazu das globale delete aufgerufen wird.<br />

Plötzlich bekommt also das globale delete e<strong>in</strong>en Block zur Freigabe, den<br />

es selbst gar nicht bereitgestellt hat! Je nachdem, welcher Algorithmus für<br />

die globale Speicherverwaltung implementiert wurde, kann dies dazu führen,<br />

dass sich die Entwickler des Programms mit erheblichen Tiefflugversuchen<br />

desselben konfrontiert sehen, die sie sich beim besten Willen nicht erklären<br />

können.<br />

Daher möchte ich hier ganz e<strong>in</strong>dr<strong>in</strong>glich e<strong>in</strong>en Ratschlag anbr<strong>in</strong>gen:<br />

Wenn man e<strong>in</strong>e <strong>in</strong>dividuelle Speicherverwaltung für e<strong>in</strong>e Klasse<br />

schreibt, dann müssen unbed<strong>in</strong>gt immer die Operatoren paarweise<br />

implementiert werden. Niemals darf e<strong>in</strong> new ohne zugehöriges<br />

delete implementiert werden oder umgekehrt!<br />

Je nachdem, was man mit <strong>in</strong>dividueller Speicherverwaltung <strong>in</strong> Klassen<br />

bezweckt, kann man vorausschauend genug arbeiten, um dieses Problem zum<strong>in</strong>dest<br />

<strong>in</strong> e<strong>in</strong>igen Fällen gar nicht erst aufkommen zu lassen. Nehmen wir<br />

an, die new und delete Operatoren wurden deshalb <strong>in</strong> e<strong>in</strong>er Klasse <strong>in</strong>dividuell<br />

implementiert, weil zusätzlich zum Beschaffen und Freigeben von Speicher<br />

noch etwas anderes stattf<strong>in</strong>den soll (z.B. <strong>in</strong>krementieren bzw. dekrementieren<br />

e<strong>in</strong>es Reference Counters). Wo der Speicher herkommt, ist allerd<strong>in</strong>gs den<br />

Operatoren egal, sie würden sowieso e<strong>in</strong>fach nur malloc und free verwenden.<br />

Für diesen Fall kann man den zuvor erwähnten Stolperste<strong>in</strong> umgehen,<br />

<strong>in</strong>dem man nicht malloc und free aufruft, sondern stattdessen, mittels<br />

Scope-Operator, die globalen Operatoren new und delete bzw. new[] und<br />

delete[]. Solange diese nicht von uns besonders implementiert s<strong>in</strong>d, werden<br />

automatisch die system<strong>in</strong>ternen Operatoren herangezogen, sonst unsere<br />

besonderen Varianten. Schreiben wir also unsere Implementation der Operatoren<br />

für das MemoryManagedObject den neuen Erkenntnissen entsprechend<br />

um (global_new_delete_overload<strong>in</strong>g_version2.cpp):

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!