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!