Bonjour à tous!
Si je créé un conteneur du genre:
Que devient l'espace alloué lorsque je "sors" des accolades? Faut-il le libérer et comment?Code:
1
2
3
4
5
6
7 //... { std::map<int,int*> m; m[0]=new int(1); m[1]=new int(2); }//....
Version imprimable
Bonjour à tous!
Si je créé un conteneur du genre:
Que devient l'espace alloué lorsque je "sors" des accolades? Faut-il le libérer et comment?Code:
1
2
3
4
5
6
7 //... { std::map<int,int*> m; m[0]=new int(1); m[1]=new int(2); }//....
Quand tu "sors" des accolades la map est détruite, mais tu as effectivement une fuite mémiore par rapport au "new int".
La solution est dans la FAQ
Merci!
Ce qui est vexant, c'est que j'avais regarder dans la FAQ avant de poster...:roll:
Il y a encore un truc plus général sur les pointeurs que je ne cerne pas.
Si j'écris:
Est-ce que ça produit également une fuite ou s'agit-il d'une ré-allocation?Code:
1
2
3 int* p=new int(2); p=new int(3);
Tu as effectivement une fuite de mémoire. Ton pointeur, au deuxième new, pointe vers un nouveau bloc en mémoire, et plus personne pointe vers le premier => fuite mémoire car impossible de le libérer.
Même si tu rajoutes des deletes à la fin de ton bloc, ton code ne sera pas exception-safe.
Image le code suivant :
Maintenant, que se passe-t-il si new int(2) lève une exception ?Code:
1
2
3
4
5 std::map<int,int*> m; m[0]=new int(1); m[1]=new int(2); delete m[1]; delete m[0];
La mémoire pointée par m[0] n'est jamais libérée.
Une solution, en C++0x, est
std::map<int, std::unique_ptr<int> >.
Des solutions moins bonnes en C++03 sont
std::map<int, std::shared_ptr<int> >
std::map<int, clone_ptr<int> >
boost::ptr_map<int, int>
Merci pour les réponses.
J'ai survolé quelques articles sur les pointeurs intelligents et je pense les utiliser plus tard.
Pour le moment, j'ai ré-écrit mon destructeur mais sans tenir compte du cas soulevé par loufoque.
Cours-y rapidement, te dirais-je :mouarf:
Un peu connexe à ce qu'on dit dans cette discussion, tu risques de perdre ton pointeur avec des choses comme ça :
Prudence, prudence....Code:
1
2
3 m[0]=new int(1); m[0]=new int(2);
Bien sûr posé comme ça ça à l'air absurde. Mais dans un code complexe ce sont des cas qui peuvent apparaître. Et je parle d'expérience car j'ai déjà eu à debugger ce genre de chose (dans une équipe tu ne maitrises pas forcément ce que fait tout le monde)