Wenn Sie die genaue Größe des zu verwendenden Speichers nicht kennen, benötigen Sie eine dynamische Zuordnung ( malloc
). Ein Beispiel könnte sein, wenn ein Benutzer eine Datei in Ihrer Anwendung öffnet. Sie müssen den Inhalt der Datei in den Speicher lesen, aber natürlich kennen Sie die Größe der Datei nicht im Voraus, da der Benutzer die Datei zur Laufzeit vor Ort auswählt. Grundsätzlich benötigen malloc
Sie also, wenn Sie die Größe der Daten, mit denen Sie arbeiten, nicht im Voraus kennen. Zumindest ist dies einer der Hauptgründe für die Verwendung malloc
. In Ihrem Beispiel mit einer einfachen Zeichenfolge, deren Größe Sie zum Zeitpunkt der Kompilierung bereits kennen (und die Sie nicht ändern möchten), ist es wenig sinnvoll, diese dynamisch zuzuweisen.
Etwas abseits des Themas, aber ... Sie müssen sehr vorsichtig sein, um bei der Verwendung keine Speicherlecks zu verursachen malloc
. Betrachten Sie diesen Code:
int do_something() {
uint8_t* someMemory = (uint8_t*)malloc(1024);
// Do some stuff
if ( /* some error occured */ ) return -1;
// Do some other stuff
free(someMemory);
return result;
}
Sehen Sie, was mit diesem Code nicht stimmt? Es gibt eine bedingte Rückgabeanweisung zwischen malloc
und free
. Es mag zunächst in Ordnung erscheinen, aber denken Sie darüber nach. Wenn ein Fehler auftritt, kehren Sie zurück, ohne den von Ihnen zugewiesenen Speicher freizugeben. Dies ist eine häufige Ursache für Speicherlecks.
Natürlich ist dies ein sehr einfaches Beispiel, und es ist sehr leicht, den Fehler hier zu erkennen, aber stellen Sie sich Hunderte von Codezeilen vor, die mit Zeigern, malloc
s, free
s und allen Arten der Fehlerbehandlung übersät sind . Die Dinge können sehr schnell sehr chaotisch werden. Dies ist einer der Gründe, warum ich in anwendbaren Fällen modernes C ++ gegenüber C sehr bevorzuge, aber das ist ein ganz anderes Thema.
Stellen Sie daher bei malloc
jeder Verwendung sicher, dass Ihr Speicher so wahrscheinlich free
wie möglich ist.
malloc()
fehlschlagen können!