Maison  >  Article  >  développement back-end  >  Est-ce que `vector::erase()` détruit les objets dans un vecteur de pointeurs ?

Est-ce que `vector::erase()` détruit les objets dans un vecteur de pointeurs ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-30 02:07:28985parcourir

 Does `vector::erase()` Destroy Objects in a Vector of Pointers?

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!

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