Heim >Backend-Entwicklung >C++ >Zerstört „Vector::erase()' automatisch Objektzeiger?
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*> & a ) { for ( int i = 0; i < a.size(); i++ ) { delete a[i]; } a.clear(); }
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; } };
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>
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!