In C++ erfolgt die Speicherverwaltung mithilfe der expliziten Operatoren new und delete, die den Speicher dynamisch zuweisen und freigeben. Bei der manuellen Verwaltung ist es jedoch leicht, Speicherlecks oder doppelte Freigaben zu verursachen.
Mit der Einführung des C++11-Standards wurden Smart Pointer eingeführt — wie std::unique_ptr, std::shared_ptr, std::weak_ptr. Diese verwalten automatisch den Lebenszyklus von Objekten und garantieren die Freigabe von Ressourcen, wenn sie den Gültigkeitsbereich verlassen, selbst im Falle von Ausnahmen.
Beispiel für den Vergleich:
// Manuelle Speicherfreigabe Foo* ptr = new Foo(); // ... delete ptr; // Sicherer mit Smart Pointer std::unique_ptr<Foo> ptr2 = std::make_unique<Foo>(); // delete ist nicht erforderlich — alles erledigt unique_ptr für Sie
Smart Pointer verringern das Risiko von Speicherlecks und machen den Code sicherer und lesbarer.
Was passiert, wenn Sie delete zweimal für dasselbe Pointer aufrufen?
Antwort: Nach dem ersten Aufruf von delete ist der Speicher bereits freigegeben. Ein weiterer Aufruf führt zu undefiniertem Verhalten (undefined behavior). Beispiel:
Foo* p = new Foo(); delete p; delete p; // FEHLER!
Um dies zu vermeiden, setzen Sie den Pointer nach der Freigabe auf nullptr:
delete p; p = nullptr;
Geschichte
In einem großen C++-Projekt hat der Entwickler die dynamische Speicherfreigabe manuell über
deletedurchgeführt, jedoch vergessen, den Pointer beim Verlassen mehrerer Pfade der Funktion bei Ausnahmen zu löschen. Dies führte zu Speicherlecks, die nur bei Lasttests festgestellt wurden.
Geschichte
Beim Versuch, rohe Pointer zwischen verschiedenen Teilen des Codes zu teilen, trat eine doppelte Speicherfreigabe auf — ein Teil des Codes rief
deleteauf, ohne die anderen zu benachrichtigen. Ergebnis: Segfault in Produktion, die Analyse des Core Dumps zeigte sofort die Ursache.
Geschichte
Nach der Migration eines alten Projekts auf neue C++-Standards wurde ein Teil des Codes mit rohen Pointern beibehalten, während die neuen Klassen bereits mit Smart Pointern arbeiteten. Es traten Fehler bei der Übertragung von Ressourcenbesitz auf: Der Speicher wurde „zweimal“ freigegeben — zuerst manuell, dann automatisch durch die Destruktoren der Smart Pointer.