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 :

Problème de mémoire debug/release


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Points : 53
    Points
    53
    Par défaut Problème de mémoire debug/release
    Bonjour,

    Je travaille sur une DLL en C++ et je suis confronté à de gros problèmes de mémoire. C'est un domaine (la gestion de la mémoire) dans lequel je ne suis pas trop à l'aise....

    Donc voilà..

    J'ai un point d'entrée dans ma DLL qui procède a de l'allocation dynamique sur une dizaine de tableaux à 1 dimensions et sur 3 tableaux à 2 dimensions.
    En fin de traitement je libère la mémoire réservée.

    Quand j'observe la mémoire disponible en exécutant ma DLL en mode debug, tout marche nickel, j'ai un pic d'utilisation mémoire après mon allocation et tout est intégralement libéré ensuite...tout ?...et bien pas tout à fait...il me reste quelques octets qui s'accumulent, rien de bien méchant, je "perds" 10Mo après une 100aine d'exécution de la fonction. Mais tout ça n'est pas très grave, à moins que ce ne soit une piste à suivre pour la suite ...

    Quand je fait la même observation en mode release, la mémoire n'est pas libérée ou moins libérée en tout cas, car l'utilisation du fichier dans le gestionnaire de tâche augmente à chaque exécution, jusqu'à atteindre la quantité disponible et là je me tape des codes erreur (normal).

    Mais pourquoi une telle différence de comoprtement entre les modes DEBUG et RELEASE ?

    Si vous avez une explications, ou une piste à suivre je suis preneur.
    De même si vous avez des bouquins traitant de la gestion de mémoire en C++ à me conseiller ;-)

    D'avance merci
    Ben

  2. #2
    Membre confirmé Avatar de toxcct
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 434
    Points : 511
    Points
    511
    Par défaut
    avec quel outil mesures tu tes utilisations mémoires ?

    aussi, quel est ton environnement de dev ?
    besoin de réponses ? demande a un pote

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Points : 53
    Points
    53
    Par défaut
    D'une part je regarde le gestionnaire de tâches: "utilisation du fichier" et l'historique de l'utilisation du fichier d'échange. Dans le code je loggue aussi des appels à GlobalMemoryStatus et je fait la différence entre dwTotalPhys et dwAvailPhys.

    Sinon, autant pour moi, mon environnement est Visual C++ 6 sous WinXP Pro SP2.

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Il peut y avoir une différence entre la libération dans ton programme et dans la DLL. S'il y a une fonction dans la DLL pour libérer la mémoire, il faut l'utiliser pour la mémoire allouée par la bibliothèque.
    Si tu peux modifier la DLL, rajoute la libération de la mémoire dans une fonction de la bibliothèque.
    Ca peut arriver si les versions des bibliothèques de gestion de la mémoire sont différentes ie différents compilos, différentes versions, différentes configurations - debug/release -, ...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Miles
    Il peut y avoir une différence entre la libération dans ton programme et dans la DLL. S'il y a une fonction dans la DLL pour libérer la mémoire, il faut l'utiliser pour la mémoire allouée par la bibliothèque.
    Si tu peux modifier la DLL, rajoute la libération de la mémoire dans une fonction de la bibliothèque.
    Ca peut arriver si les versions des bibliothèques de gestion de la mémoire sont différentes ie différents compilos, différentes versions, différentes configurations - debug/release -, ...
    Excuse moi Miles mais je ne comprends pas quand tu parles de différence entre mon programme et ma DLL ?? (i.e. différence debug(programme) et release(DLL)?)
    SInon pour libérer la mémoire dans mon code j'utilise simplement l'opérateur/fonction delete. Est-ce un tort ?

  6. #6
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Le "programme" est l'application qui charge et utilise ta DLL.
    "Don't think you are, know you are..." (Morpheus)

  7. #7
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Tu n'as pas précisé quel outil de développement ?
    Je suppose aue c'est VC++.
    Encore fois ( faire une recherche sur les forums ) il y a des grosses différences entre le mode debug et release parce qu'en mode Debug le compilo alloue plus de mémoire et une pile plus importante pour les variables ce qui peut masquer des dysfonctionnements ( consulter le MSDN ).
    Quand j'observe la mémoire disponible en exécutant ma DLL en mode debug, tout marche nickel, j'ai un pic d'utilisation mémoire après mon allocation et tout est intégralement libéré ensuite...tout ?...et bien pas tout à fait...il me reste quelques octets qui s'accumulent, rien de bien méchant, je "perds" 10Mo après une 100aine d'exécution de la fonction. Mais tout ça n'est pas très grave, à moins que ce ne soit une piste à suivre pour la suite ...

    Quand je fait la même observation en mode release, la mémoire n'est pas libérée ou moins libérée en tout cas, car l'utilisation du fichier dans le gestionnaire de tâche augmente à chaque exécution, jusqu'à atteindre la quantité disponible et là je me tape des codes erreur (normal).
    C'est du domaine de la gestion mémoire C++; il faut appeler delete [] nom_variable si tu alloues un tableau dynamique
    int *p;
    p=new int[20];
    //....
    delete []p;
    p=NULL;
    Sinon utilises std::vector par exemple c'est vraiment plus souple ou bien si tu utilises VC++ , CArray, CList...

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Mat.M
    Tu n'as pas précisé quel outil de développement ?
    Je suppose aue c'est VC++.
    Encore fois ( faire une recherche sur les forums ) il y a des grosses différences entre le mode debug et release parce qu'en mode Debug le compilo alloue plus de mémoire et une pile plus importante pour les variables ce qui peut masquer des dysfonctionnements ( consulter le MSDN ).

    C'est du domaine de la gestion mémoire C++; il faut appeler delete [] nom_variable si tu alloues un tableau dynamique

    Sinon utilises std::vector par exemple c'est vraiment plus souple ou bien si tu utilises VC++ , CArray, CList...
    C'est exactement ce que je fais

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Points : 53
    Points
    53
    Par défaut
    merci, je regarde ça tout de suite

Discussions similaires

  1. Réponses: 17
    Dernier message: 12/08/2010, 15h30
  2. Problème d'exécution en release mais pas en debug (2)
    Par animageo dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/11/2007, 14h22
  3. Problème passage de debug à release
    Par beni46 dans le forum Physique
    Réponses: 1
    Dernier message: 20/08/2007, 12h39
  4. Réponses: 3
    Dernier message: 18/08/2005, 10h17
  5. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11

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