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 ?

Comment supprimer en toute sécurité des pointeurs dans un vecteur sans détruire les objets vers lesquels ils pointent ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-31 03:51:31343parcourir

 How Do You Safely Delete Pointers in a Vector Without Destroying the Objects They Point To?

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*> &amp; 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn