Maison > Article > développement back-end > Comment supprimer en toute sécurité des pointeurs dans un vecteur sans détruire les objets vers lesquels ils pointent ?
vector::erase() : Suppression de pointeurs sans destruction d'objet
Problème :
Un vecteur de pointeurs d'objet nécessite la suppression d'un élément tout en préservant l'objet lui-même. Cependant, des inquiétudes surviennent concernant la destruction potentielle de l'objet lors de sa suppression.
Réponse :
vector::erase() supprime efficacement les éléments d'un vecteur et invoque le destructeur. . Cependant, lorsqu'il s'agit de pointeurs, le destructeur n'intervient pas dans la destruction de l'objet lui-même. En effet, le conteneur ne s'approprie pas les objets pointés.
Solution :
Pour supprimer les objets pointés, il est impératif d'employer explicitement l'opérateur de suppression sur chaque pointeur. Voici un extrait de code illustratif :
<code class="cpp">void clearVectorContents( std::vector <YourClass*> & a ) { for ( int i = 0; i < a.size(); i++ ) { delete a[i]; } a.clear(); }
Attention :
Le stockage de pointeurs bruts dans des conteneurs standard n'est pas conseillé. Au lieu de cela, envisagez d'utiliser boost::shared_ptr pour gérer efficacement l'allocation des ressources avec des pointeurs.
Solution élégante :
Pour une approche plus polyvalente et efficace, implémentez un foncteur pour supprimer pointeurs dans le vecteur. Voici une illustration :
<code class="cpp">// Functor for deleting pointers in vector. template<class T> class DeleteVector { public: // Overloaded () operator. // This will be called by for_each() function. bool operator()(T x) const { // Delete pointer. delete x; return true; } };</code>
L'invocation de ce foncteur avec for_each fournit une solution rapide et concise :
<code class="cpp">for_each( myclassVector.begin(),myclassVector.end(), DeleteVector<myclass*>());</code>
où myclassVector désigne le vecteur contenant des pointeurs vers les objets myclass.
Cette stratégie garantit que tous les objets pointés sont éliminés en toute sécurité tout en préservant l'intégrité du vecteur.
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!