Conteneur : Suppression d'élément
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 :
Citation:
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.
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.
Voici mon code :
Une liste d'objet->
Code:
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; |
Et un itérateur pour les parcourrir :
Code:
1 2 3 4 5 6 7 8
|
l_Triangle::iterator i_Tri = Liste->begin();
while (i_Tri != Liste->end())
{
i_Tri++;
} |
bon le truc c'est que si je fait :
Code:
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++;
} |
Ca bugge et je sais pourquoi (je détruit mon itérateur donc le i_Tri++ plante
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:
Citation:
Exemple] Comment détruire les pointeurs d'un conteneur ? [haut]
auteur : Laurent Gomila
Code:
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; |
Merci
MProg
Merci d'essayer de ne pas confondre QUOTE et CODE koala01