Fuite de mémoire avec std::list

Résolu
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 8 août 2005 à 17:22
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 - 8 août 2005 à 21:03
Bonjour,
J'ai un pb de fuite avec std::list, sous VC++ 7.1
J'ai ce problème seulement quand mon objet est global, ou bien local dans main
Voila un code qui perd 12 octets par exemple:


#include
#include <list>
#include <crtdbg.h>
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)

using namespace std;

int main()
{
list l;
_CrtDumpMemoryLeaks();
}

Voila, comme je suis un gros maniaque, j'aimerais bien que cela disparaisse
Si quelqu'un voit le problème...

14 réponses

xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
8 août 2005 à 17:42
Comment peux tu être sur d'une fuite, si tu ne sais pas la mesurer ? La desallocation de list s'effectue apres ton debug_leak...

C'est pas bien les variables globales...
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 août 2005 à 17:26
Au fait j'ai le même problème avec map, mais pas avec string ni vector par exemple
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
8 août 2005 à 17:31
Tu es sur que ce n'est pas le fait d'instrumenter ton code (avec un truc en C visiblement) qui cause la fuite de mémoire. La STL est fiable.
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
8 août 2005 à 17:32
Je comprends pas ton code au passage, tu testes la mémoire avant la destruction de la liste.... tu aurais pas oublié un bloc ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 août 2005 à 17:35
La STL est fiable... ca dépend si elle est bien implémentée ou pas a mon avis. Ou je pourrais mettre l'appel _CrtDumpMemoryLeaks() selon toi, si ce n'est la? Je peux rien mettre après le main...
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
8 août 2005 à 17:37
Si tu sous entends que MS ne sait pas implémenter la STL, je veux bien te croire ;-)

main()
{
{
//bidule list
}
// debug leak
}
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 août 2005 à 17:39
problème: c'est en fait une variable globale... Je vais devoir utiliser un pointeur et faire new/delete moi même...
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
8 août 2005 à 17:45
Tu fais des listes de type integral ou de type utilisateur. Ca peut venir du contenu et non du conteneur ;-)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 août 2005 à 17:48
Non ca vient bien du conteneur, mais comme la désallocation se fait après...
J'utilise un pointeur global et j'alloue dans le main, m'en fout si c'est pas beau, ya que moi qui voit
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
8 août 2005 à 17:51
Il existe peut être une solution plus élégante et fiable. Le risque est d'utiliser ton pointeur dans une classe statique ou globale...(avant l'allocation dans le main)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 août 2005 à 19:31
Pas si je fais l'allocation dès le début. T'inquiète pas, je sais ce que je fais
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
8 août 2005 à 19:41
Pourquoi tu veux faire new/delete? Il n'y a pas de fuite.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 août 2005 à 20:46
Parce que je veux pas en voir avec mon _CrtDumpMemoryLeaks, ca me permettra de voir facilement si j'ai des fuites ou pas, au lieu de me dire "cette fuite la n'en n'est pas une, celle la oui..."
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
8 août 2005 à 21:03
Tu dois absolument éviter la solution avec pointeur, meme si tu
controle la durée de vie de ton objet (mais tu vois dans ce cas meme ca
c'est inutile) tu dois l'eviter car a grande echelle c'est
inmaintenable.



Une solution serait de mettre "_CrtDumpMemoryLeaks();" dans le
destructeur d'une variable static. Ca fonctionnera si tu n'as pas ce
probleme avec d'autre variables static ou l'ordre de destruction n'est
plus previsible.



#include

#include <list>

#include <crtdbg.h>

#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)



using namespace std;



namespace

{

class Foo

{

class Bar

{

~Bar() {

_CrtDumpMemoryLeaks();

}

}; // class Bar

static Bar bar; // on aurait pu mettre en globale mais c'est plus propre comme ca

}; // class Foo

} // namespace



int main()

{

list l;



}
0
Rejoignez-nous