9 Stimmen

Deallokation von Objekten, die in einem Vektor gespeichert sind?

Ich habe eine Klasse, die einen Vektor von Objekten erstellt. Im Deconstructor für diese Klasse versuche ich, den den Objekten zugewiesenen Speicher freizugeben. Ich versuche, dies zu tun, indem ich einfach eine Schleife durch den Vektor mache. Wenn also der Vektor maps aufgerufen wird, tue ich das:

Building::~Building() {
    int i;
    for (i=0; i<maps.size(); i++) {
        delete[] &maps[i];
    }
}

Wenn ich das Programm ausführe, kommt es zu Fehlern beim Freigeben von Speicher. Ich glaube, ich lösche das Array, in dem die Objekte gespeichert sind, und nicht die Objekte selbst. Ist das korrekt? Wenn nicht, haben Sie eine Idee, was ich falsch mache?

0voto

Anhand Ihrer Frage ist es schwer zu sagen, was die Signatur von maps ist. Ich nehme an, Sie wollen die delete[] denn Sie haben auch new[] . Bedeutet das, dass die Mitglieder Ihres Vektors selbst eine Sammlung ist? angenommen, es ist, dann haben Sie etwas wie dieses:

class Building {
  public:
    typedef int* maps_t;
  private:
    std::vector<maps_t> maps;
  public:
    Building();
    ~Building();
};

Building::Building(size_t num_maps) {
  for(;num_maps; --num_maps)
  {
    maps.push_back(new Building::maps_t[10]);  
  }
}

In diesem Fall ist Ihr Destruktor fast richtig; Sie müssen nur die &maps[i] a maps[i] .

Building::~Building() {
    int i;
    for (i=0; i<maps.size(); i++) {
        delete[] maps[i];
    }
}

Aber in C++ wollen wir die Dinge nur selten so machen. Zum einen, wenn man nicht gerade versucht, etwas zu implementieren wie std::vector wollen Sie nur selten verwenden new[] o delete[] ausdrücklich. Sie können z. B. Folgendes verwenden std::vector . In diesem Fall brauchen Sie keine explizite Speicherverwaltung durchzuführen. Ihre Klasse wird wie folgt aussehen:

class Building {
  public:
    typedef std::vector<int> maps_t;
  private:
    std::vector<maps_t> maps;
  public:
    Building();
};

Building::Building(size_t num_maps) {
  for(;num_maps; --num_maps)
  {
    maps.push_back(Building::maps_t(10));  
  }
}

In diesem Fall gibt es keinen benutzerdefinierten Destruktor, da std::vector verwaltet seinen eigenen Speicher bereits recht gut.

-2voto

John Carter Punkte 6368

Wenn Sie Folgendes verwenden std::vector dann können Sie es einfach durch den Destruktor für vector unter der Annahme, dass es "Objekte" (und nicht Zeiger auf Objekte) in der genannten vector .

-- oder --

Wenn Sie ein Standard-Array als " vector ":

Der Zweck der " delete [] "Variante besteht darin, ein ganzes Array zu deallokieren und damit die Notwendigkeit zu vermeiden, eine for Schleife, wie Sie es tun.

Bei Verwendung von Standard-C/C++-Arrays, " delete [] maps " sollte es für Sie tun. " [] " sollte nicht zum Deallokieren von STL verwendet werden vector s.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X