Frage

Ich habe 2 Klassen, sagen A & B. Klasse B eine destructor seiner eigenen hat. Innerhalb der Klasse A, habe ich einen Vektor von Zeigern auf Objekte der Klasse B. Der Vektor ist folgt wie:

vector<B*> vect;

In der destructor für Klasse A, wie rufe ich Speicher? Wenn ich Zyklus durch den Vektor, rufe ich jedes Objekt und verwenden Sie auf jeden abgerufene Objekt löschen? Ich habe versucht, dass in den destructor, aber es Segfaults.

Jede Hilfe zur Lösung dieses Problems ist sehr willkommen. Es tut mir leid, aber ich kann den Code nicht veröffentlichen.

War es hilfreich?

Lösung

Einige andere Beiträge wiesen darauf hin, dass Sie besser mit intelligenten Zeigern anstelle von Zeigern. Wenn Sie Zeiger aus irgendeinem Grund zu verwenden, haben auch immer, sollten Sie sie in einer Schleife löschen zuerst.

for ( std::vector<B*>::iterator it = vect.begin(); it != vect.end(); ++it)
    delete (*it);
vect.clear();

edit: Wenn Ihr Programm segfault im Destruktor dann ist der Code falsch. Sie setzten Stapelelement von Adresse in dem Vektor Vielleicht, aber ein Objekt muss es sein, auf dem Heap.

löschen
#include <iostream>
#include <vector>
#include <string>

class data {
public:
    std::string d;
    data(std::string _d) : d(_d) { }
};

class container {
public:
    std::vector<data*> c;
    container() { c.clear(); }
    void add (data *d) { c.push_back(d); }
    ~container() {
        for (std::vector<data*>::iterator it = c.begin(); it != c.end(); ++it)
            delete (*it); 
        c.clear();
    }
};

int main (int argc, char* argv[]) {

    typedef std::vector<std::string> sVec;
    typedef sVec::iterator sVecIter;

    std::vector<std::string> cmd (argv+1, argv+argc);

    {
    container k;            
    for (sVecIter it = cmd.begin(); it != cmd.end(); ++it)
        k.add(new data((*it)));

    }

    return 0;

}

Das funktioniert problemlos.

Andere Tipps

Wenn A die Dinge, auf die vect besitzt, dann sollte es in der Lage sein, jedes Element innerhalb delete vect. Wenn es Segfaults während dies zu tun, dann haben Sie einen Fehler irgendwo in Ihrem Code.

In der Regel aber sind Sie besser dran intelligente Zeiger verwenden. Boost- ptr_vector (Teil von Boost.Pointer Container für Ihr spezielles Beispiel bestimmt ist, sondern eine einfache std::vector<std::tr1::shared_ptr<B> >will auch Arbeit (wenn auch mit mehr Aufwand und mehr umständlich Syntax).

Ja, wenn die Elemente des Typs B* Punkt auf Objekte auf dem Heap zugewiesen, dann für jedes Element, das Sie sollten es löschen aufrufen.

Ja, Sie würden die Vektorschleife und jedes Element löschen. Das Problem ist, dass Sie das Handtuch Betreiber auf der Leitung 42 vergessen.

Sie möchten speichern Zeiger in Containern zu vermeiden, wenn Sie ihre Lebensdauer verwalten müssen.

Wenn dies der einzig wahre Eigentümer ist und gewährleistet ist, um Bereinigungs letzte sein dann mit Ich würde gehen

std::vector<B> vect;

Wenn Sie verschiedene Referenzen und Lebensdauern haben, die dann Shared_ptr überlappen können besser wäre (std :: tr1 oder Boost je nach Compiler)

std::vector< boost::shared_ptr<B> > vect;

Aus Ihrer Beschreibung klingt es wie Ihr vect Member der Klasse A sollte Lebensdauer Eigentum an den Daten, die von der B haben wies *.

Ich würde empfehlen, nur diese Erklärung zu ändern, um

vector< std::tr1::shared_ptr<B> > vect;

EDIT: ersetzt auto_ptr mit std :: tr1 :: shared_ptr

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top