Maison  >  Article  >  développement back-end  >  L'effacement des pointeurs d'un vecteur en C détruit-il les objets référencés ?

L'effacement des pointeurs d'un vecteur en C détruit-il les objets référencés ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-30 19:58:03432parcourir

  Does Erasing Pointers from a Vector in C   Destroy the Referenced Objects?

L'effacement d'objets d'un vecteur de pointeurs détruit-il les objets eux-mêmes ?

Lors de la manipulation de vecteurs de pointeurs vers des objets, il est important de comprendre le implications de l’utilisation de la fonction delete(). Bien que Eraser() supprime un élément d'un vecteur et appelle son destructeur, cela ne détruit pas automatiquement l'objet référencé.

Implications pour les pointeurs d'objet dans les vecteurs

Dans le Dans le contexte des pointeurs d'objet, Eraser() détache simplement le pointeur du vecteur mais ne s'approprie pas la destruction de l'objet sous-jacent. Pour garantir une bonne gestion des ressources, vous devez explicitement appeler delete sur chaque pointeur pour supprimer l'objet référencé.

Approche suggérée pour effacer les pointeurs en toute sécurité

Pour effacer en toute sécurité les pointeurs et leurs objets associés à partir d'un vecteur, vous pouvez utiliser l'approche suivante :

<code class="cpp">void clearVectorContents(std::vector<YourClass*> &a) {
    for (int i = 0; i < a.size(); i++) {
        delete a[i]; // Delete the object pointed to by each pointer
    }
    a.clear(); // Remove pointers from the vector
}

Approche alternative utilisant des pointeurs partagés

Pour une solution plus élégante et générique, pensez à utiliser boost ::shared_ptr. Les pointeurs partagés gèrent automatiquement la propriété et la suppression des ressources, ce qui rend la gestion des vecteurs de pointeurs plus sûre et plus facile.

Solution améliorée utilisant des modèles et des foncteurs

Cette solution améliorée utilise des modèles et foncteurs pour simplifier le processus de suppression du pointeur :

<code class="cpp">template<class T> class DeleteVector {
    public:
    // Delete pointer
    bool operator()(T x) const { delete x; return true; }
};</code>

Utilisation :

<code class="cpp">for_each(myclassVector.begin(), myclassVector.end(), DeleteVector<myclass*>());</code>

Exemple de code

L'exemple suivant montre l'utilisation du solution améliorée :

<code class="cpp">#include <functional>
#include <vector>
#include <algorithm>
#include <iostream>

// Your class
class myclass {
    public:
    int i;
    myclass(): i(10) {}
};

int main() {
    // Vector of pointers to myclass objects
    std::vector<myclass*> myclassVector;
    
    // Add objects to vector
    for (int i = 0; i < 10; ++i) myclassVector.push_back(new myclass);

    // Print initial vector contents
    for (auto& obj : myclassVector) std::cout << " " << obj->i;

    // Delete vector contents using enhanced solution
    for_each(myclassVector.begin(), myclassVector.end(), DeleteVector<myclass*>());

    // Clear vector
    myclassVector.clear();

    // Print vector size after deletion
    std::cout << "\n" << myclassVector.size();
    
    return 0;
}</code>

En utilisant ces approches, vous pouvez supprimer en toute sécurité des éléments des vecteurs contenant des pointeurs d'objet tout en garantissant une bonne gestion des ressources et la destruction des objets.

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