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.

187 {<br />

188 switch (mem type)<br />

189 {<br />

190 case FAST:<br />

191 case NON VOLATILE:<br />

192 return ( malloc ( s i z e ) ) ;<br />

193 }<br />

194 return ( 0 ) ;<br />

195 }<br />

196<br />

12.3 Speicherverwaltung 365<br />

197 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

198 /∗ This i s j u s t a dummy implementation f o r demo purposes . . .<br />

199 ∗/<br />

200 void MemoryProvider : : freeMemBlock ( void ∗ base ptr )<br />

201 throw( )<br />

202 {<br />

203 i f ( base ptr )<br />

204 f r e e ( base ptr ) ;<br />

205 }<br />

So e<strong>in</strong>ige Leser werden sich jetzt fragen, ob ich vielleicht zu lange <strong>in</strong> der Sonne<br />

war, weil ich hier doch tatsächlich die Funktionen malloc und free verwende.<br />

In Abschnitt 6.2.2 habe ich noch ausdrücklich erklärt, dass man von diesen<br />

Funktionen tunlichst die F<strong>in</strong>ger lassen soll und stattdessen new und delete<br />

verwenden soll. Der Grund für diesen verme<strong>in</strong>tlichen Regelverstoß ist e<strong>in</strong>fach<br />

zu erklären: Wenn man schon new und delete implementiert, dann bewegt<br />

man sich ja bereits e<strong>in</strong>e Ebene tiefer unten und muss e<strong>in</strong>fach irgendwo her<br />

e<strong>in</strong>en nicht <strong>in</strong>itialisierten Speicherblock bekommen. Deshalb ist es <strong>in</strong> diesem<br />

Kontext (und ausschließlich <strong>in</strong> diesem!) erlaubt und zumeist notwendig, mit<br />

malloc und free zu arbeiten.<br />

Folgende von C übernommene Funktionen werden angeboten, wenn man<br />

<strong>in</strong>kludiert:<br />

void *malloc(size_t size): Allokiert Speicher der Größe size und liefert<br />

den Base-Po<strong>in</strong>ter darauf. Der Speicher, der allokiert wird, ist nicht<br />

<strong>in</strong>itialisiert.<br />

void *calloc(size_t num,size_t size): Allokiert Speicher der Größe<br />

num * size, <strong>in</strong>itialisiert diesen mit 0 und liefert den Base-Po<strong>in</strong>ter darauf.<br />

void free(void *base_ptr): Gibt Speicher, der entweder über Aufruf von<br />

malloc oder calloc allokiert wurde, wieder frei.<br />

void *realloc(void *base_ptr,size_t size): Ändert die Größe des<br />

durch base_ptr referenzierten Speicherblocks auf size. Da nicht garantiert<br />

werden kann, dass der Block nicht z.B. im Zuge e<strong>in</strong>es Vergrößerns<br />

verschoben werden muss, wird der neue Base-Po<strong>in</strong>ter des Blocks zurückgeliefert.<br />

Der neu h<strong>in</strong>zugekommene Speicher ist nicht <strong>in</strong>itialisiert.<br />

Vorsicht Falle: Man sieht, es gibt also auch tatsächlich e<strong>in</strong> realloc, obwohl<br />

ich es bisher konsequent unter den Tisch gekehrt habe. Allerd<strong>in</strong>gs wird auch<br />

auf dieser unteren Ebene dr<strong>in</strong>gendst von dessen Verwendung abgeraten!<br />

Das Problem bei realloc ist, dass der Block im Speicher verschoben

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!