Maison > développement back-end > C++ > le corps du texte

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

Patricia Arquette
Libérer: 2024-10-31 03:51:31
original
342 Les gens l'ont consulté

 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(); 
} 
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!