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 :

Mémoire après exécution du programme


Sujet :

C++

  1. #1
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut Mémoire après exécution du programme
    Bonjour,

    Désolé, je ne sais vraiment pas où poster ce message... Etant donné qu'il contient du code C++ je le poste ici.

    Imaginons ce bout de code très simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main(int argc, char** argv)
    {
        int* var = new int;
        return 0;
    }
    Comme vous le voyez, la mémoire n'est pas libérée par un delete... Je me demandais si à la fin de l'exécution du programme (et non pas du bloc contenant le new, même si dans ce cas cela revient au même) la mémoire serait finalement libérée...
    Cela dépend forcément de l'OS (c'est pour ça que je ne sais pas si mon message à sa place ici), je voulais donc juste savoir si un Windows XP ou un Linux avec un kernel à jour laisse passer ce genre de fuites ou non. Je suppose qu'il doit y avoir une espèce de garbage collector intégré à l'OS mais je n'en suis pas sûr...

    Merci !
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Un OS récent ne laisse pas passer ce genre de fuite: Toute la mémoire d'un processus est libérée à la fin de celui-ci (ce n'est pas une histoire de GC, c'est que la mémoire est toujours associée au processus qui la possède).

    Sous Win32, tous les handles que possède un process sont également fermés, et tous les objets de synchronisations sont détruits quand le dernier handle sur lui est fermé...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Et si l'on fait un programme ou il y a de nombreux oublis de delete, l'OS va tout ramasser après?
    Mais pourquoi XP ne (apparemment) ramasse-t-il pas ou mal?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si si, XP ramasse tout, comme tous les systèmes NT. Mais seulement à la fin d'un programme ---> Pour un serveur, c'est un peu mort.

    Àprès, il y a d'autres choses que XP garde en cache, comme les exécutables ou certains fichiers... Mais là ce n'est pas un bug, c'est une feature.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Heureusement que les OS récents récupèrent la mémoire car quand on voit comment les applications utilisent la mémoire en général, un serveur serrait très rapidement à cours de ressource, hors on ne redémarre pas un serveur comme on le faisait avec win98 alors qu'il travaille beaucoup.

    Pour exemple, Firefox gère mal la mémoire, il ne libère tout qu'en le fermant, donc est-ce lui ou l'OS qui fait le travail ? Le mystère est entier.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pour FF, c'est une feature aussi (mise en cache des fichiers téléchargés). Mais la partie idiote, c'est quand le "cache mémoire" (par opposition au "cache disque") se met à déborder en mémoire virtuelle (voire même à dépasser la mémoire virtuelle, forçant Windows à l'augmenter), annulant son efficacité.
    Il est possible de limiter la taille du cache disque sous FF, mais pas celle du cache mémoire...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Si quelqu'un peut m'expliquer grossièrement (ou me donner une doc qui explique) comment il est possible de savoir combien de mémoire dans le tas un programme a utilisé au cour de son exécution, je suis preneur... Par définition, on ne le sait pas lors de la compilation, alors comment ça se passe ? Un espace précis du tas est allouée lors de l'exécution du programme et le programme l'utilise à sa guise ? Ca serais étonnant...
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  8. #8
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Citation Envoyé par Médinoc
    Pour FF, c'est une feature aussi (mise en cache des fichiers téléchargés). Mais la partie idiote, c'est quand le "cache mémoire" (par opposition au "cache disque") se met à déborder en mémoire virtuelle (voire même à dépasser la mémoire virtuelle, forçant Windows à l'augmenter), annulant son efficacité.
    Il est possible de limiter la taille du cache disque sous FF, mais pas celle du cache mémoire...
    Bizarre, dans les news annonçant la V2 de Firefox, il est dit que cette version corrige le BUG de la non libération de mémoire de firefox (sauf à sa fermeture). Cela était bien présenté un bug. Il faudrait que je retrouve l'article.

    Si ce n'était pas un bug, ce n'est quand même pas pratique, car si on ne ferme pas firefox (ce qui souvent le cas), on se retrouve avec plus de 200 Mo de mémoire utilisée alors qu'on peut n'avoir qu'1 ou 2 onglets d'ouvert.

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En effet, ce que j'appelle "la partie idiote" est sans doute un bug.

    Woufeil : Tu veux dire à des fins de débogage ou pour l'OS ?
    Car l'OS sait en permanence à quel process appartient telle page mémoire. C'est lui qui gère l'allocation, après tout.

    Ensuite, dans les pages mémoires allouées à un process, il crée les différentes zones de code ou de données, dont un tas (oui, un par process) qui généralement peut grandir pour consommer plus de pages (c'est le cas de Windows, en tout cas, sauf qu'un process peut carrément demander la création de tas supplémentaires avec HeapCreate()).

    Lorsqu'un tas est détruit, la mémoire allouée "dans" se tas est donc considérée comme libérée (le tas lui-même n'existe plus) et les pages mémoire utilisées deviennent libres pour l'OS.
    Quand un process se termine, toutes les pages qui appartenaient à ce process sont libérées par l'OS.


    Donc, en fait, il n'y a pas UN tas mais deux niveaux de tas: Celui géré au niveau du kernel et de la MMU (Memory Management Unit) qui gère toute la mémoire virtuelle d'un process et qui se mesure en pages mémoire, et le tas créé pour chaque process au sein de l'espace qui lui a été alloué par le kernel.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par Woufeil
    Si quelqu'un peut m'expliquer grossièrement (ou me donner une doc qui explique) comment il est possible de savoir combien de mémoire dans le tas un programme a utilisé au cour de son exécution, je suis preneur...
    Sous Windows on peut connaitre la mémoire allouée dans le tas par différence d'état, en appelant plusieurs fois (au moins 2) la fonction _CrtMemCheckpoint() puis éventuellement _CrtMemDifference().
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Mais ça, c'est uniquement pour le "CRT Debug Heap" (Tas de débogage de la C Run-Time Library), qui me semble-t-il, ajoute des informations pour cela...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Merci !

    €dit : je ne savais pas qu'il y avait un tas par process en fait. Vu que le tas est représenté comme un espace bordélique (pas d'ordre quoi) je me diais qu'on utilisait le même pour tout, ce qui est en fait assez con...
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  13. #13
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Comme disait Louis XVI enfant dans le bac à sable :
    Les tas c'est moi !
    Bon ok, je sors.

  14. #14
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Parenthèse. Aujourd'hui, a peu près tous les OS maintenus sauront récupérer la mémoire consommée par un process. Même si ce dernier ne l'a pas correctement récupérée explicitement.
    Par contre, ce n'est pas vrai pour les autres ressources (à quelques exceptions près liées à l'OS). Un pot de peinture alloué via une API propriétaire ne sera pas collecté à la terminaison du process.
    Des bouts de FAQ connexes à cela -> RAII.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  15. #15
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Je me suis amusé à créer un gestionnaire de mémoire pour la période de débuggage en C++...

    Ce n'est pas tres évolué, dans le sens ou il ne prend en compte que les operateurs new, new[] (en indiquant le fichier et la ligne à laquelle il est survenu), delete et delete[], mais il a au moins l'avantage d'exister, de prendre en charge le logging des allocations/libérations mémoire, incluant un rapport des pointeurs non libérés (et leur libération) ainsi que celui des éventuelles exceptions rencontrées durant son office, et d'être, théoriquement compatible linux et windows (en tous cas, avec les compilos que j'ai testés)

    Il est possible d'activer/désactiver l'affichage de l'ensemble des informations à l'écran, et les logs sont en francais.

    Pour ceux que cela intéresse, voici le zip des fichier utilisés, les codes sources étant relativement bien commentés, il vous "suffira" théoriquement d'inclure le fichie debug/enabledebug.h dans les entetes de vos codes sources

    Nota: les critiques constructives seront les bienvenues ...Surtout si elles devaient me permettre de gérer, par exemple la destruction implicite des objets lors de la destruction d'une référence en fin de routine
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. État de la mémoire après exécution d'un POP
    Par nayssa78 dans le forum Assembleur
    Réponses: 5
    Dernier message: 09/02/2012, 16h01
  2. Programme encore en mémoire après Arrêt (?)
    Par LeGilles69 dans le forum Débuter avec Java
    Réponses: 11
    Dernier message: 25/07/2009, 01h56
  3. Réponses: 2
    Dernier message: 24/07/2009, 16h35
  4. Réponses: 2
    Dernier message: 23/04/2009, 09h28
  5. Réponses: 8
    Dernier message: 27/07/2007, 09h25

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