Heim > Backend-Entwicklung > C++ > Hauptteil

Zerstört „Vector::erase()' automatisch Objektzeiger?

Patricia Arquette
Freigeben: 2024-11-03 00:21:29
Original
602 Leute haben es durchsucht

 Does `Vector::erase()` Automatically Destroy Object Pointers?

Zerstört Vector::erase() Objektzeiger?

Beim Arbeiten mit einem Vektor von Objektzeigern ist es wichtig, das Verhalten zu verstehen von vector::erase() auf die gespeicherten Objekte. Dieser Artikel untersucht das Problem und bietet Lösungen zur Aufrechterhaltung der Objektintegrität.

Vector::erase() entfernt ein Element aus einem Vektor, indem es seinen Destruktor aufruft. Wenn das enthaltene Objekt ein Rohzeiger ist, übernimmt vector::erase() nicht die Verantwortung für die Zerstörung des referenzierten Objekts.

Um die referenzierten Objekte in einem Zeigervektor explizit zu zerstören, müssen Sie für jedes Objekt manuell delete aufrufen enthaltenen Zeiger. Der folgende Codeausschnitt zeigt beispielsweise, wie der Inhalt eines Zeigervektors gelöscht wird:

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

    a.clear();
}
Nach dem Login kopieren

Es ist jedoch nicht ratsam, Rohzeiger in Standardcontainern zu speichern. Eine robustere Lösung ist die Verwendung gemeinsamer Zeiger (z. B. boost::shared_ptr), um eine ordnungsgemäße Objektzerstörung sicherzustellen.

Eine elegante Lösung mit Funktoren und Vorlagen

Ein Generikum Eine elegante Alternative besteht darin, Funktoren und Vorlagen zum Löschen von Zeigern in einem Vektor zu verwenden. Hier ist ein umfassendes Beispiel:

<code class="cpp">class DeleteVector {
public:
    bool operator()(T x) const {
        // Delete pointer.
        delete x;
        return true;
    }
};
Nach dem Login kopieren

Dieser Funktor kann in Verbindung mit std::for_each() verwendet werden, um einen Vektor zu durchlaufen und die enthaltenen Zeiger zu löschen. Der folgende Code zeigt beispielsweise, wie Sie den Funktor „DeleteVector“ verwenden, um den Inhalt eines Vektors von Myclass-Zeigern zu löschen:

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

Mit diesem Ansatz können Sie die referenzierten Objekte in einem Vektor nahtlos und ohne Bedenken löschen über Objektlebenszyklusmanagement oder mögliche Speicherlecks.

Das obige ist der detaillierte Inhalt vonZerstört „Vector::erase()' automatisch Objektzeiger?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage