Heim > Artikel > Backend-Entwicklung > Zerstört „vector::erase()“ Objekte in einem Zeigervektor?
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!