Bonjour,
Je voudrais savoir lorsque je fait un erase ou un remove dans un conteneur de type list (STL) si l'élément est juste effacé du conteneur et existe encore en dehors du conteneur, ou s'il est vraiment effacé pour de bon mémore vidée etc...
J'ai trouvé ça dans la FAQ :
Dans mon cas je pense qu' "il s'agit d'un pointeur sur un objet" mais alors je ne sait pas comment effacer "proprement" un élément.Dois-je effacer ce que j'ai stocké dans un vecteur ? [haut]
auteur : LFE
La réponse dépend de la nature de ce qui est stocké dans un vecteur.
S'il s'agit d'un objet, il n'est pas utile de le détruire, il le sera lorsqu'il est retiré du vecteur, ou lorsque le vecteur est détruit.
Par contre, s'il s'agit d'un pointeur sur un objet, il faut le détruire car un pointeur n'est pas un objet. Si cette destruction n'est pas faite, le programme présentera une fuite de mémoire.
Voici mon code :
Une liste d'objet->
Et un itérateur pour les parcourrir :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 using namespace std; #include <list> class Triangle { public : Vecteur *v[3]; Triangle(); }; typedef list<Triangle*> l_Triangle;
bon le truc c'est que si je fait :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 l_Triangle::iterator i_Tri = Liste->begin(); while (i_Tri != Liste->end()) { i_Tri++; }
Ca bugge et je sais pourquoi (je détruit mon itérateur donc le i_Tri++ plante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 l_Triangle::iterator i_Tri = Liste->begin(); while (i_Tri != Liste->end()) { delete i_Tri; i_Tri = NULL; i_Tri++; }
puisque je peux pas ajouter 1 à un itérateur qu n'existe plus)
Je sais pas comment faire pour supprimer un ou plusieur éléments de ma liste sans fuite de mémoire.
j'ai trouvé ca dans la FAQ mais je sais pas m'en servir:
MerciExemple] Comment détruire les pointeurs d'un conteneur ? [haut]
auteur : Laurent Gomila
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 #include <list> #include <algorithm> // Foncteur servant à libérer un pointeur - applicable à n'importe quel type struct Delete { template <class T> void operator ()(T*& p) const { delete p; p = NULL; } }; int main() { // Création d'une liste de pointeurs std::list<int*> l; l.push_back(new int(5)); l.push_back(new int(0)); l.push_back(new int(1)); l.push_back(new int(6)); // Destruction de la liste : attention il faut bien libérer les pointeurs avant la liste ! std::for_each(l.begin(), l.end(), Delete()); return 0;
MProg
Merci d'essayer de ne pas confondre QUOTE et CODE koala01
Partager