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 :

Gestion de la mémoire [Débutant(e)]


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Gestion de la mémoire
    Bonjour à tous,

    Je suis débutant en C++ et j'aurais une question extrêment vague : quelles sont les erreurs fréquentes de codage qui engendrent de grandes fuites de mémoire ?

    Je m'explique : je suis en train de créer un petit lecteur audio en C++ / SDL (je n'en suis qu'au début).

    Quand j'ouvre la boîte de dialogue "Ouvrir", et que je regarde ce que ça consomme en faisant Ctrl Alt Suppr, je vois qu'à chaque fois que je redessine la boîte de dialogue, l'application utilise 20 Mo de plus... alors que la mémoire utilisée devrait logiquement être constante.

    Je suppose que c'est cela qu'on appelle les "fuites de mémoire", et je crois aussi savoir que c'est dû principalement aux allocations dynamiques. Et pourtant, j'ai relu tout mon code plusieurs fois : à chaque "malloc" correspond un "free", et à chaque "new" correspond un "delete". Y compris dans les constructeurs et dans les destructeurs...

    Donc ma question est : est-ce qu'il y a des cas où il y a des subtilités, est-ce qu'il peut y avoir des fuites de mémoire même quand à chaque "new" correspond un "delete", ou bien est-ce qu'il s'agit forcément d'une libération qui n'a pas lieu ?


    Désolé d'être aussi vague, mais je suis vraiment perdu


    Je vous remercie

  2. #2
    Membre expérimenté Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Par défaut
    Hmm, si ce n'est pas les couples new / delete, c'est probablement la mémoire allouée / desalloué par les fonctions SDL que tu utilise.

    Je ne connais pas SDL, mais fait attention : si il y a des fonctions create, pense a bien utiliser la fonction delete/destroy correspondante pour demander a SDL de detruire l'objet que tu lui a demandé de creer precedemment...

  3. #3
    Membre éclairé

    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Par défaut
    La principale cause des fuites mémoire en C++ est de ne pas utiliser le RAII : http://arb.developpez.com/c++/raii/shared_ptr/.

    Ton probleme me fait penser à une allocation de ressource dans une boucle, voir même dans la boucle principale.
    Est-tu sûr de n'ouvrir les images dont tu as besoin pour ton interface qu'une seul fois ?
    C'est clair que si tu ouvre la même image pour la mettre en mémoire à chaque itération, il n'est pas étonant que tu monte de 20Mo par seconde !

    Une fuite mémoire est dû à une allocation dynamique, mais cette allocation peut très bien être cachée dans une fonction (d'ouverture d'image pour SDL, par exemple), attention donc à toujours utiliser les fonctions associées pour liberer les ressources.

    Et oui, il peut y avoir des probleme même quand un delete est appelé : lorsqu'un new[] a creer l'instance.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Personnellement, je considère que shared_ptr ce n'est pas du vrai RAII, puisqu'il y a partage.

    Le RAII, c'est simplement faire l'acquisition de toutes les ressources dans le constructeur et les libérer dans le destructeur. Si tu copies l'objet il faut donc copier les ressources etc. (si tu choisis de rendre l'objet copiable)
    A priori donc, le RAII c'est justement la propriété unique et sans partage.

  5. #5
    Membre éclairé

    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Personnellement, je considère que shared_ptr ce n'est pas du vrai RAII, puisqu'il y a partage.

    Le RAII, c'est simplement faire l'acquisition de toutes les ressources dans le constructeur et les libérer dans le destructeur. Si tu copies l'objet il faut donc copier les ressources etc. (si tu choisis de rendre l'objet copiable)
    A priori donc, le RAII c'est justement la propriété unique et sans partage.
    Je pense la même chose, mais j'ai utilisé le moteur de recherche du site et je suis tombé là dessus. Je l'ai mit plus comme un exemple que comme definition du RAII ; merci de la précision !

    Pour une definition plus formelle du RAII : http://en.wikipedia.org/wiki/Resourc...Initialization.

  6. #6
    Membre éclairé
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Par défaut
    Hello,
    à un niveau moindre (je suis également débutant), il y a aussi le delete[] auquel il faut penser pour libérer les tableaux.

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 02/02/2006, 12h03
  2. gestion de la mémoire
    Par moldavi dans le forum C++
    Réponses: 17
    Dernier message: 04/02/2005, 23h18
  3. Réponses: 11
    Dernier message: 26/12/2004, 22h50
  4. Gestion de la mémoire entre plusieurs DLL
    Par Laurent Gomila dans le forum C++
    Réponses: 7
    Dernier message: 27/07/2004, 15h28
  5. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 12h44

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