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

C++ Discussion :

[explication]Fuite mémoire new()


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut [explication]Fuite mémoire new()
    Bonjour,
    Je viens vous demander quelques précisions sur la gestion des exceptions levés par l'opérateur new().
    si j'écrit ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try
    {
        CClasse *obj = new CClasse()
    }catch(bad_alloc)
    {}
    Ceci me gère-t-il correctement mon problème si j'ai un erreur d'allocation?
    Appele-t-il seul le destructeur de cette classe?
    Une autre question aussi, si j'écrit ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try
    {
        CClasse obj = new CClasse()
    }catch(bad_alloc)
    {}
    Quel est la différence exactement? il n'est pas allouer dans la pile, mais la gestion de l'exception est-elle gérée de la même manière?

    je vous remercie.

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Cclasse obj = new Cclasse();

    ça compilera pas ça...


    Pour le premier cas : si l'erreur est levée non la ressource ne sera pas libérée. C'est pour ça qu'on utilise le RAII ...


    Pour plus de détails voir la faq .. ici :
    http://cpp.developpez.com/faq/cpp/in...POINTEURS_raii

  3. #3
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Oui effectivement j'ai fait un bete copier coler...

    Mais donc pour le premier cas, je n'ai pas la possiblité d'appeler de destructeur si l'exception est levée? ou de libérer les espaces mémoires réservés lors du new()?
    Car si cela échoue, j'ai un fuite mémoire, non?

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    en tout cas normalement tu n'as pas à te soucier de ce genre d'exceptions dans ton programme. En règle générale tu les laisses se propager et terminer le programme. ( ça sert à quoi de continuer si tu ne peux plus rien allouer? )

    sinon une autre page de la FAQ:
    http://cpp.developpez.com/faq/cpp/in...S_constructeur

    ( et bien sûr généralement on se passera des pointeurs quand on peut )

  5. #5
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Très bien merci
    Je ne voudrais pas abuser de votre gentilesse mais j'aurais une dernière interrogation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau = new CConteneur[5]
    ceci peut créer une fuite mémoire n'est-ce pas?
    et je la gère comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try{
        Tableau = new CConteneur[5]
    }catch(bad_alloc)
    {
    if (Tableau!= 0)
        delete [] Tableau;
    }
    Merci beaucoup de votre aide.

  6. #6
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Bonjour,
    A priori, le delete est inutile.
    - Si l'exception est levée pendant l'allocation, il n'y a pas de raison de desaouler.
    - Si elle est lever pendant la construction, le destructeur ne sera pas appelé. Mais la désalocation le sera. La seul chose que tu as a faire est donc de t'assurer que ton constructeur est exception-safe. C'est a dire qu'il n'y aura pas de fuite mémoire dans le cas d'une exception levée. (En général, le RAII est la solution utilisée). Ceci ce fait dans le constructeur(ou dans le choix des membre de ta class), et non dans le bloque catch.

    Plus d'info ici, dans Think in cpp volume 2:
    http://nicolas.blancpain.free.fr/Doc...tml#Heading253

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. new anonyme et fuite mémoire
    Par Darz4 dans le forum Langage
    Réponses: 4
    Dernier message: 20/12/2012, 23h28
  2. [tomcat][memoire] java.net.URL et fuite mémoire
    Par Seiya dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 09/03/2009, 10h41
  3. Outil de recherche de fuite mémoire
    Par eag35 dans le forum MFC
    Réponses: 4
    Dernier message: 02/02/2005, 12h46
  4. [SWT]SWT et fuite mémoire(ou pas)
    Par menuge dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/06/2004, 21h40
  5. [debug] fuites mémoires
    Par tmonjalo dans le forum C
    Réponses: 3
    Dernier message: 28/07/2003, 17h20

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