Maison > Article > développement back-end > Est-ce que `vector::erase()` détruit les objets dans un vecteur de pointeurs ?
Vector ::Erase détruit-il des objets dans un vecteur de pointeurs ?
Lorsque vous traitez des vecteurs contenant des pointeurs d'objet, effacer un élément à l'aide du vecteur ::erase() soulève des inquiétudes quant au sort des objets pointés. Bien que vector::erase() supprime l'élément du vecteur, il ne détruit pas automatiquement l'objet réel.
Comportement de Vector::Erase
Vector:: Eraser() supprime l'élément du vecteur mais ne s'approprie pas la destruction de l'objet. Cependant, si l'objet contenu est un pointeur brut, vector::erase() n'appelle pas son destructeur avant sa suppression.
Gestion des pointeurs bruts
Pour garantir une ressource appropriée gestion, vous devez supprimer explicitement chaque pointeur contenu pour supprimer les objets vers lesquels ils pointent. Ceci peut être réalisé en utilisant une boucle :
<code class="cpp">void clearVectorContents(std::vector<YourClass *> &a) { for (int i = 0; i < a.size(); i++) { delete a[i]; } a.clear(); }
Éviter les pointeurs bruts
Le stockage des pointeurs bruts dans des conteneurs standard est généralement déconseillé. Pour les objets alloués dynamiquement, envisagez d'utiliser des pointeurs intelligents comme boost::shared_ptr pour gérer la gestion de la mémoire.
Solution générique et élégante
Une solution plus élégante utilise des modèles et le for_each algorithme :
<code class="cpp">// Functor for deleting pointers in vector template<class T> class DeleteVector { public: void operator()(T x) const { delete x; } };</code>
Ce foncteur peut être utilisé avec for_each pour supprimer des pointeurs dans un vecteur :
<code class="cpp">for_each(myclassVector.begin(), myclassVector.end(), DeleteVector<myclass *>());</code>
Exemple d'utilisation
Considérez un vecteur de pointeurs vers des objets myclass. Le code suivant alloue, imprime et supprime les objets :
<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>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!