Heim  >  Artikel  >  Backend-Entwicklung  >  Zerstört „vector::erase()“ Objekte in einem Zeigervektor?

Zerstört „vector::erase()“ Objekte in einem Zeigervektor?

Linda Hamilton
Linda HamiltonOriginal
2024-10-30 02:07:28987Durchsuche

 Does `vector::erase()` Destroy Objects in a Vector of Pointers?

Zerstört Vector::Erase Objekte in einem Vektor von Zeigern?

Beim Umgang mit Vektoren, die Objektzeiger enthalten, wird ein Element mithilfe von vector gelöscht ::erase() wirft Bedenken hinsichtlich des Schicksals der Objekte auf, auf die verwiesen wird. Während vector::erase() das Element aus dem Vektor entfernt, zerstört es nicht automatisch das eigentliche Objekt.

Verhalten von Vector::Erase

Vector:: erase() entfernt das Element aus dem Vektor, übernimmt jedoch nicht die Verantwortung für die Zerstörung des Objekts. Wenn das enthaltene Objekt jedoch ein Rohzeiger ist, ruft vector::erase() seinen Destruktor vor dem Entfernen nicht auf.

Umgang mit Rohzeigern

Um die richtige Ressource sicherzustellen Bei der Verwaltung müssen Sie jeden enthaltenen Zeiger explizit löschen, um die Objekte zu löschen, auf die er verweist. Dies kann mithilfe einer Schleife erreicht werden:

<code class="cpp">void clearVectorContents(std::vector<YourClass *> &a) {
    for (int i = 0; i < a.size(); i++) {
        delete a[i];
    }
    a.clear();
}

Rohzeiger vermeiden

Von der Speicherung von Rohzeigern in Standardcontainern wird generell abgeraten. Erwägen Sie für dynamisch zugewiesene Objekte die Verwendung intelligenter Zeiger wie boost::shared_ptr für die Speicherverwaltung.

Generische und elegante Lösung

Eine elegantere Lösung verwendet Vorlagen und for_each Algorithmus:

<code class="cpp">// Functor for deleting pointers in vector
template<class T> class DeleteVector {
public:
    void operator()(T x) const {
        delete x;
    }
};</code>

Dieser Funktor kann mit for_each verwendet werden, um Zeiger in einem Vektor zu löschen:

<code class="cpp">for_each(myclassVector.begin(), myclassVector.end(), DeleteVector<myclass *>());</code>

Beispielverwendung

Betrachten Sie a Vektor von Zeigern auf Myclass-Objekte. Der folgende Code ordnet die Objekte zu, druckt und löscht sie:

<code class="cpp">#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

class myclass {
public:
    int i;
    myclass(): i(10) {}
};

// Functor for deleting pointers in vector
template<class T> class DeleteVector {
public:
    void operator()(T x) const {
        delete x;
    }
};

int main() {
    // Vector of myclass pointers
    std::vector<myclass *> myclassVector;

    // Add objects to the vector
    for (int i = 0; i < 10; i++) {
        myclassVector.push_back(new myclass);
    }

    // Print object values
    for (int i = 0; i < myclassVector.size(); i++) {
        std::cout << " " << (myclassVector[i])->i;
    }

    // Delete objects using functor and for_each
    for_each(myclassVector.begin(), myclassVector.end(), DeleteVector<myclass *>());

    // Clear the vector
    myclassVector.clear();

    // Print the empty vector size
    std::cout << "\n" << myclassVector.size();

    return 0;
}</code>

Das obige ist der detaillierte Inhalt vonZerstört „vector::erase()“ Objekte in einem Zeigervektor?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn