destruction d'objets dans un vecteur
Bonjour !!!
Voilà. Je récupère un pointeur sur un vecteur de "command", qui correspond à un vecteur de pointeurs sur des instances de classe "command".
voici la redéfinition du tableau de pointeurs, ainsi que le proto de la méthode appelée, qui me retourne ce fameux pointeur sur un vecteur :
Code:
1 2 3
|
typedef vector< command* > v_commands;
v_commands* parseFragment( string xmlFragment ); |
Chaque pointeur du vecteur pointe sur une instance de "command" qui a été créée avec l'opérateur new avant d'être insérée dans le tableau.
Code:
1 2 3 4 5 6 7 8 9 10
|
v_commands* aCommands = new v_commands;
for( ... )
{
command* cmd = new command();
// ajout du pointeur de "cmd" dans le vecteur
(*aCommands).push_back( cmd );
} |
Je pars donc du principe que si j'ai utilisé "new", il faut donc que je fasse un "delete" pour éviter les fuites mémoires.
Après le traitement de mon vecteur, j'aimerai donc faire un delete sur chaque élément, afin de libérer la mémoire allouée pour le processus.
J'ai donc créé une méthode comme suivant :
Code:
1 2 3 4 5 6 7 8
|
void DesallocCommands( v_commands* cmds )
{
for( int i = (*cmds).size(); i > 0; i-- )
delete (*(*cmds).at(i));
(*cmds).clear();
} |
A laquelle je passe le pointeur sur mon vecteur.
Je pensais ensuite pouvoir déréférencer tout d'abord le vecteur
(*cmds)
puis récupérer le pointeur à l'index i
(*cmds).at(i)
et enfin, déréférencer ce dernier
(*(*cmds).at(i))
pour appliquer un delete dessus, ce qui me semble logique, pour atteindre le réel élément en mémoire et non pas son pointeur ou autre chose... Mais non, ma console plante lamentablement...
J'ai tenté plusieurs recherches sur le forum, j'ai lu dans la FAQ le chapitre sur les destructeurs, mais il doit me manquer un élément... C'est surement tout con, mais je n'arrive pas à trouver...
Si quelqu'un détecte l'erreur, je lui en serai reconnaissant :)
D'avance merci.
Re: destruction d'objets dans un vecteur
Citation:
Envoyé par titouille
Je pars donc du principe que si j'ai utilisé "new", il faut donc que je fasse un "delete" pour éviter les fuites mémoires.
Bon principe. Attention par contre, si tu dupliques un des pointeurs, il faut faire attention à ne pas effacer plusieurs fois l'objet (par exemple, avec un tel vector, impossible d'appeler correctement remove).
Citation:
Envoyé par titouille
Je pensais ensuite pouvoir déréférencer tout d'abord le vecteur
C'est généralement assez rare de manipuler un pointeur sur un vecteur... Qu'est-ce qui justifie ce choix ici ?
Citation:
Envoyé par titouille
(*cmds)
puis récupérer le pointeur à l'index i
(*cmds).at(i)
et enfin, déréférencer ce dernier
Pourquoi ? Faire ça est équivalent à
Code:
1 2
| int *pi = new int;
delele *i; |
Ce qui n'est pas bon.