4 Stimmen

Wie erstelle ich einen generischen std::vector Destruktor?

Wenn Sie einen Vektor mit Zeigern auf Objekte haben und dann die Funktion clear verwenden, werden die Destruktoren für die Objekte im Vektor nicht aufgerufen. Ich habe eine Funktion, um dies manuell zu tun, aber ich weiß nicht, wie man diese eine generische Funktion für jede Art von Objekten, die im Vektor sein könnte zu machen.

void buttonVectorCleanup(vector<Button *> dVector){
    Button* tmpClass;
    for(int i = 0; i < (int)dVector.size(); i++){
        tmpClass = dVector[i];

        delete tmpClass;
    }
}

Dies ist die Funktion, die ich habe, die gut für eine bestimmte Art von Objekt im Vektor funktioniert, aber ich möchte eine einzelne Funktion, die jede Art von Vektor mit Objektzeigern nehmen könnte.

8voto

Leon Timmermans Punkte 29718

Sie können die Boost-Funktion Zeigerbehälter . Sie sind hocheffizient und sicher.

6voto

KeithB Punkte 15939

Am besten ist es, intelligente Zeiger zu verwenden, wie z. B. von Boost . Dann werden die Objekte automatisch gelöscht.

Oder Sie können eine Vorlagenfunktion erstellen

template <class T>
void vectorCleanup(vector<T *>& dVector){
    T* tmpClass;
    for(vector<T*>::size_type i = 0; i < dVector.size(); i++){
        tmpClass = dVector[i];

        delete tmpClass;
    }

}

2voto

Ein paar andere Punkte - Sie wollen wahrscheinlich einen Verweis auf den Vektor, nicht eine Kopie übergeben. tmpClass ist nicht erforderlich - Sie können den Zeiger direkt löschen. Sie sollten entweder die Größe des Vektors auf 0 ändern oder die Zeiger nach dem Löschen durch NULL ersetzen - andernfalls könnten Sie in der aufrufenden Funktion auf nicht zugewiesenen Speicher zugreifen.

2voto

Johann Gerell Punkte 24065

Ich verwende einen speziellen Funktor, um den Zeiger zu löschen und ihn auf NULL zu setzen:

struct delete_ptr
{
    template <typename T>
    void operator()(T& p)
    {
        delete p;
        p = 0;
    }
};

Das wird verwendet mit std::for_each (Vergessen Sie auch nicht #include <algorithm> ):

int wmain(int, wchar_t*[])
{
    std::vector<int*> items;
    items.push_back(new int(1));
    items.push_back(new int(2));
    items.push_back(new int(3));
    std::for_each(items.begin(), items.end(), delete_ptr());
};

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