Fuite de mémoire avec std::list [Résolu]

Signaler
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
-
steve_clamage
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
-
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

Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

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...
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Au fait j'ai le même problème avec map, mais pas avec string ni vector par exemple
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

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.
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

Je comprends pas ton code au passage, tu testes la mémoire avant la destruction de la liste.... tu aurais pas oublié un bloc ?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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...
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

Si tu sous entends que MS ne sait pas implémenter la STL, je veux bien te croire ;-)

main()
{
{
//bidule list
}
// debug leak
}
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
problème: c'est en fait une variable globale... Je vais devoir utiliser un pointeur et faire new/delete moi même...
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

Tu fais des listes de type integral ou de type utilisateur. Ca peut venir du contenu et non du conteneur ;-)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

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)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Pas si je fais l'allocation dès le début. T'inquiète pas, je sais ce que je fais
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
2
Pourquoi tu veux faire new/delete? Il n'y a pas de fuite.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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..."
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
2
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;



}