ProgrammierungC++ Backend-Entwickler

Beschreiben Sie die Speicherverwaltung in C++. Was ist der Unterschied zwischen new/delete und Smart Pointern, und warum ist es vorzuziehen, Smart Pointer zu verwenden?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

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.

Trickfrage.

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;

Beispiele für reale Fehler aufgrund von Unkenntnis der Feinheiten des Themas.


Geschichte

In einem großen C++-Projekt hat der Entwickler die dynamische Speicherfreigabe manuell über delete durchgefü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 delete auf, 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.