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 :

incomprehension delete / utilisation memoire


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut incomprehension delete / utilisation memoire
    Bonjour,

    J'ai une question qui me tracasse car je n'ai pas compris un truc concernant la gestion memoire en C++. Pour quoi avec ce programme la RAM disponible sur le système n'est pas restitué après les delete ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #include <iostream>
    #include <string>
    #include <vector>
     
    #include <sys/sysinfo.h>
     
    using namespace std;
     
     
    int main()
    {
        cout << "In main.\n";
     
        struct sysinfo myinfos;
        sysinfo( & myinfos );
        unsigned long prevfreeram = myinfos.freeram;
     
        std::vector<std::string*> strings;
     
        for ( unsigned e=0; e<10000000; e++ )
            strings.push_back( new std::string( "test" ) );
     
        sleep( 12 );
     
        sysinfo( & myinfos );
        unsigned long duringfreeram = myinfos.freeram;
        std::cout << "perte du free = " << prevfreeram - duringfreeram << std::endl;
     
        strings.clear();
        for ( std::vector<std::string*>::iterator it = strings.begin(); it != strings.end(); it++ )
            delete( *it );
     
        sleep( 7 );
     
        sysinfo( & myinfos );
        unsigned long afterfreeram = myinfos.freeram;
        std::cout << "recup du free = " << afterfreeram - duringfreeram << std::endl;
     
        std::cout << prevfreeram << " " << duringfreeram <<  " " << afterfreeram << std::endl;
    }
    RESULTAT

    > ./a.out
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    In main.
    perte du free = 882229248
    recup du free = 253952
    6703034368 5820805120 5821059072
    OK cela concerne l'ensemble des process du système mais la taille que j'alloue reste negligeable par rapport à d'autres allocations eventuelles du système pendant ce temps court.

    Je suis sur linux et le top également me renvoie la même chose pour le process concerné.

    Merci beaucoup d'avance.

  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 518
    Points
    41 518
    Par défaut
    J'ignore comment c'est sous nux, mais sous Windows, il y a une différence entre "le tas" et "la mémoire": La mémoire est composée de pages, et le tas occupe certaines pages.

    Ainsi, il arrive considère "vide" une zone mémoire, sans pour autant rendre les pages à l'OS. Par exemple, le tas possède une granularité plus fine que la mémoire, et peut allouer deux blocs dans la même page. Dans ce cas, la page ne peut pas être rendue à l'OS tant que les blocs ne sont pas tous les deux libérés.

    Ou parfois, le tas garde tout simplement en mémoire des pages vides parce qu'il n'a pas pris le temps de vérifier qu'elles l'étaient. Généralement, on laisse au programmeur d'applications la possibilité de forcer la vérification au moment le plus opportun...
    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
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut, et bienvenue sur le forum.

    Généralement il ne sert pas à grand chose d'utiliser des pointeurs sur des std::string, surtout lorsqu'il s'agit de les placer dans un std::vector

    Le corolaire de cette première phrase est qu'il ne faut pas non plus demander l'allocation dynamique sur des std::string

    Mais pour en revenir à ton problème, c'est, tout simplement, que tu travailles à l'envers:

    Tu demande de "vider" ton tableau, puis de libérer la mémoire allouée à chacun des éléments... d'un tableau vide... Cherchez l'erreur

    Ne crois tu pas qu'il serait beaucoup plus logique de parcourir le tableau (avant de l'avoir vidé) pour demander de libérer la mémoire allouée à chaque élément, puis, seulement, de vider le tableau
    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

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci à vous deux pour votre réactivité !

    Koala01 merci pour tes remarques annexes sur les std:::string. Pour le clear avant les delete, il s'agit d'une erreur de copier/coller bien sur !!!
    Mon exemple ci-dessus reste valable en commentant la ligne "strings.clear()".

    Medinoc, admettons que sous linux (gcc 4.1.2 20070626 - Red Hat 4.1.2-14) le mécanisme de gestion de memoire est le même que pour windows, dans mon cas il devrait y avoir au moins une grande majorité des pages qui se désalloueraient pour 500 megs de strings "test" non ?
    Sinon, j'avais mis le sleep de quelques secondes aussi après les delete pour justement laisser le temps à l'os de restituer les blocs s'il doit verifier certaines choses...

    thanks

  5. #5
    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 518
    Points
    41 518
    Par défaut
    Là, je ne sais pas comment ça marche.
    Il est possible que la restitution des pages se fasse seulement "à la demande", par exemple quand la mémoire est basse, mais je n'y crois pas trop...
    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.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Je viens d'essayer ce code avec une toute autre machine en retirant les appels du sysinfo et en monitorant uniquement via un top ( tout en allongeant les 2 sleeps pour bien voir l'evolution des consommations des ressources). Je consomme tjrs les 500 megs environ, même après 20 secondes après les delete ! Je ne comprend pas. C'est bien la resident memory qu'il faut regarder n'est ce pas ?

    merci encore

Discussions similaires

  1. Augmentation de l'Utilisation memoire ?
    Par Cris.p dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/01/2008, 18h44
  2. Utilisation memoire eclipse javaw.exe
    Par zulot dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 09/11/2007, 13h34
  3. [C#]utilisation memoire partagee
    Par shadowmoon dans le forum C#
    Réponses: 11
    Dernier message: 17/07/2007, 11h49
  4. Réponses: 3
    Dernier message: 27/06/2007, 11h39
  5. utilisation memoire
    Par reptils dans le forum wxWidgets
    Réponses: 1
    Dernier message: 03/02/2006, 03h27

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