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

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

Linda Hamilton
Libérer: 2024-10-30 02:07:28
original
983 Les gens l'ont consulté

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

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

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

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

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!