2017-11-28 4 views
-3

Deshalb möchte ich dies im Wesentlichen tun:Wie kann ich eine Klasse von sich selbst halten, indem ich STL-Container/Smart Pointer verwende?

struct A { 

    A *children[10]; 
}; 

Allerdings, wenn ich dies tun und eine destructor schaffen wie:

virtual ~A() { 
     for (A *child: children) { 
      delete child; 
     } 
    } 

ich einen Segmentation Fault bekommen, und ich bin mir nicht sicher, warum. Wie kann ich erreichen, eine Liste von A innerhalb von A zu halten, indem ich eine STL-Klasse verwende, damit ich mich nicht um neue/löschen kümmern muss? Ich habe versucht, Vektor und erhalten einen "unvollständigen Typ" Fehler.

+0

Haben Sie 'std :: vector ' versucht? Ich nehme nicht an, dass 'A' sich jemals selbst enthält? Ich rate nur hier, weil es hier nicht genug Informationen gibt, um etwas damit zu tun. Denken Sie daran, Ihre Frage so zu bearbeiten, dass sie ein [mcve] enthält, das für Ihr Beispiel nicht länger als etwa 20 Zeilen sein sollte. – Tas

+0

In dem hier gezeigten Code wurden die Zeiger nicht initialisiert, so dass jede dieser Löschungen undefiniertes Verhalten erzeugt. –

Antwort

0

Dieses:

for (shared_ptr<A> child: a.get()->children) { 

iterieren nicht über children - es iteriert Kopien der Zeiger in children. So erstellen Sie in jeder Iteration eine Kopie des freigegebenen (null) -Zeigers (child), legen dann diese loop-lokale Kopie auf ein neu alloziertes Objekt fest, dann geht child außerhalb des Gültigkeitsbereichs und das zugeordnete Objekt wird freigegeben. Die Zeiger im Array children werden niemals geändert.

Was Sie wollen, ist:

for (shared_ptr<A> &child: a.get()->children) { 

die explizite Referenz (&) bedeutet, dass in jeder Iteration der Schleife, child ein Verweis auf die shared_ptr im children Array wird eher als eine Kopie. Wenn Sie es zuweisen, ändert sich das Array.

+2

Also die Fragen wurden komplett geändert, Ihre Antwort passt zu der neuen Frage, meine passt zu den alten. Was soll ich hier tun, Rollback der Änderung bearbeiten? Gib auf? –

3

  1. In for (A *child: A) { delete child; ... So sollten Sie wahrscheinlich über children, nicht A Iterieren sein.
  2. Für die oben genannten zu arbeiten, sollten Sie Ihre Kinder in einem std::vector, kein rohe Array (std::vector<A> children) speichern.
  3. Verwenden Sie eine smart pointer Ihrer Wahl (wie std::shared_ptr) anstelle von rohen Zeigern, dann müssen Sie nichts löschen.
+0

Dank Ich habe herausgefunden, wie STL-Container zu verwenden, jedoch bin ich in ein Initialisierungsproblem, siehe aktualisierte Frage – BeardMagician

+5

@BeardMagician Ändern Sie die Frage nicht zu etwas völlig anderem. Stellen Sie stattdessen eine neue Frage. – LukeG

Verwandte Themen