IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

Risque de memory leak selon un analyseur


Sujet :

Visual C++

  1. #21
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Ben oui.
    Sauf sous les vieux Visual.

    C'est pour ça que je conseille plutôt maintenant:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CObjet* pObjet = new CObjet();
    CHECK_NEW(pObjet);
     
    //TO FILL
    Et là ou ça semble le plus approprié, mettre le try/catch(std::bad_alloc const &)...

  2. #22
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    OK

    Je dois donc réajuster tous mes codes à partir de maintenant! Quelle erreur de ma part d'avoir cru à un vieil article verifiant juste que c'est pas NULL
    En fait, j'utilise VISUAL 2003

  3. #23
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Si tu utilises 2003, commence par faire le test avec la classe BigRaiiAlloc, pour vérifier le comportement.

  4. #24
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    J'ai testé la classe BigRaiiAlloc avec mon VS2003, std::cout << "L'operateur new a retourne NULL!" << std::endl; ne s'est jamais exécuté ... mais ce code plante ma machine mais bon ...
    Je retiens donc que ça ne retourne jamais NULL sauf dans le cas de ce bug http://support.microsoft.com/kb/167733/fr où il faut créer son propre gestionnaire

  5. #25
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Exécute-le dans le debugger avec un breakpoint sur la ligne en question.
    Sous VC++ 6, j'ai bien droit à un affichage en règle de "L'operateur new a retourne NULL!", aussi bien en Debug qu'en Release.

  6. #26
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    Et oui ça ne s'affiche jamais mais de même aussi pour std::cout << "L'operateur new a lance une exception." << std::endl;

    Revenons aussi à un code que vous avez posté ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    else
    {
    	assert( m_pSubEntityTypesToLoad == 0 );
    	m_pSubEntityTypesToLoad = new CSubEntityTypesToLoad();
    	std::auto_ptr<CSubEntityTypeToLoad> spSETConnectedSemiEquipments( new CSubEntityTypeToLoad(enEProcessSETConnectedSemiEquipments, NULL) );
    	std::auto_ptr<CSubEntityTypeToLoad> spSETEquProductFamilies( new CSubEntityTypeToLoad(enEProcessSETEquProductFamilies, NULL) );
     
    	m_pSubEntityTypesToLoad->push_back( spSETConnectedSemiEquipments.get() );
    	spSETConnectedSemiEquipments.release();
    	m_pSubEntityTypesToLoad->push_back( spSETEquProductFamilies.get() );
    	spSETEquProductFamilies.release();
    }
    Je n'ai pas besoin de assert( m_pSubEntityTypesToLoad == 0 );, c'est facultatif?
    Pour m_pSubEntityTypesToLoad = new CSubEntityTypesToLoad();
    Donc, en gros j'ai pu retenir de ce fil que si ça se passe mal, il peut y avoir memory leak même s'il y a delete m_pSubEntityTypesToLoad au destructeur, pour cela j'ai à faire aux macros:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define CHECK_NEW_NAME_(x) obj_check_new_ ## x
    #define CHECK_NEW_NAME(x)  CHECK_NEW_NAME_(x)
    #define CHECK_NEW(p) CheckNew CHECK_NEW_NAME(__LINE__)(p)

  7. #27
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    L'assertion, c'est jusqe pour vérifier que le pointeur ne pointe pas déjà sur un truc, car l'écraser avec une nouvelle valeur serait sûrement une fuite de mémoire.

    Quant aux macros, elles ne suffisent pas, il faut la classe CheckNew en plus.

  8. #28
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    Quant aux macros, elles ne suffisent pas, il faut la classe CheckNew en plus.
    C'était juste pour limiter le message!

    L'assertion, c'est jusqe pour vérifier que le pointeur ne pointe pas déjà sur un truc, car l'écraser avec une nouvelle valeur serait sûrement une fuite de mémoire.
    Tu maitrises très bien les leaks!!!

    Qu'est ce que j'ajouterais en plus? Merci, un bon programmeur C++ doit savoir éviter les memory leaks

Discussions similaires

  1. Compilation TAO / Mfc : Memory Leaks
    Par Rolsct dans le forum CORBA
    Réponses: 4
    Dernier message: 17/04/2005, 19h13
  2. [MFC] Thread & memory leaks
    Par Racailloux dans le forum MFC
    Réponses: 7
    Dernier message: 15/03/2005, 12h44
  3. Memory leak en C/C++
    Par Roswell dans le forum Autres éditeurs
    Réponses: 6
    Dernier message: 07/07/2004, 19h41
  4. [MFC] A la chasse au memory leak
    Par Yabo dans le forum MFC
    Réponses: 17
    Dernier message: 27/06/2004, 17h35
  5. Réponses: 7
    Dernier message: 26/02/2004, 09h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo