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.

124 6. Po<strong>in</strong>ter und References<br />

Zeile 44: Egal, ob man e<strong>in</strong> e<strong>in</strong>zelnes Element oder e<strong>in</strong> Array anfordert, man<br />

muss sich um die Freigabe des Speichers kümmern, wenn er nicht mehr<br />

gebraucht wird. Und hier besteht e<strong>in</strong> kle<strong>in</strong>er Unterschied zwischen e<strong>in</strong>em<br />

dynamisch angeforderten E<strong>in</strong>zelelement und e<strong>in</strong>em Array: Bei e<strong>in</strong>em Array<br />

muss der delete[] Operator aufgerufen werden, wie <strong>in</strong> Zeile 44 zu<br />

sehen.<br />

Vorsicht Falle: Nicht nur von Neul<strong>in</strong>gen wird oft der Unterschied zwischen<br />

delete und delete[] ignoriert. Dies geht auch zumeist ohne<br />

gröbere Probleme ab, jedoch kann das nicht garantiert werden! H<strong>in</strong>ter<br />

den beiden Formen von delete verstecken sich nämlich tatsächlich<br />

verschiedene Implementationen, die auch von den Entwicklern selbst im<br />

Zuge e<strong>in</strong>es Overload<strong>in</strong>gs geschrieben se<strong>in</strong> könnten.<br />

Deshalb möchte ich hier e<strong>in</strong>e sehr e<strong>in</strong>dr<strong>in</strong>gliche Warnung aussprechen,<br />

auch wenn mancherorts <strong>in</strong> der Literatur (unrichtigerweise) Gegenteiliges<br />

behauptet wird: delete und delete[] s<strong>in</strong>d nicht äquivalent<br />

und dürfen auch nicht als äquivalent angesehen werden, obwohl<br />

sie sich oberflächlich von außen betrachtet gleich zu verhalten<br />

sche<strong>in</strong>en. Durch die Verwendung von delete wird das Freigeben<br />

e<strong>in</strong>es E<strong>in</strong>zelelements veranlasst, durch die Verwendung von<br />

delete[] wird das Freigeben e<strong>in</strong>es Arrays veranlasst. Wo auch<br />

immer e<strong>in</strong> e<strong>in</strong>faches new verwendet wird, muss der Speicher<br />

auch mit e<strong>in</strong>em e<strong>in</strong>fachen delete freigegeben werden. Bei Verwendung<br />

e<strong>in</strong>es new ...[...] muss der Speicher auch mit e<strong>in</strong>em<br />

delete[]freigegeben werden.<br />

Vorsicht Falle: Genauso, wie man nicht feststellen kann, wie viel Speicher<br />

allokiert wurde, lässt sich auch nicht feststellen, ob nun e<strong>in</strong> Array<br />

oder nur e<strong>in</strong> E<strong>in</strong>zelelement allokiert wurde. Das bedeutet, dass man ohne<br />

selbst gemerkte Zusatz<strong>in</strong>formation zur Laufzeit nicht mehr herausf<strong>in</strong>den<br />

kann, welche der delete Varianten man nun nehmen muss.<br />

Vorsicht Falle: Nicht nur Neul<strong>in</strong>ge sitzen manchmal e<strong>in</strong>em folgenschweren<br />

Irrtum auf: Ob etwas nun für den Compiler bzw. zur Laufzeit e<strong>in</strong> Array<br />

darstellt oder nicht, ist durch die Art der Anforderung bestimmt,<br />

nicht durch die Anzahl der Elemente! Auch wenn new <strong>in</strong>t32[1] nur<br />

Speicher für e<strong>in</strong> Element liefert, stellt das Ergebnis doch e<strong>in</strong> dynamisches<br />

Array dar und muss mit delete[] gelöscht werden! Auch hier ist<br />

die Verwendung des e<strong>in</strong>fachen delete nicht zulässig!<br />

Zeile 45: Hier treffen wir wieder Altbekanntes: Auch für Po<strong>in</strong>ter, die e<strong>in</strong><br />

dynamisches Array repräsentieren, gilt, dass sie nach Gebrauch auf 0<br />

gesetzt werden sollten.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!