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 :

VAS fragmentée, new/delete dans une boucle


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Points : 27
    Points
    27
    Par défaut VAS fragmentée, new/delete dans une boucle
    Bonjour,

    je ne comprend pas un truc. Quand on fait new/delete trop souvent, qu'est ce qui est fragmenté, la mémoire virtuelle ou la mémoire physique?
    Et comment se fait-il qu'au bout d'un certain temps on a plus de mémoire virtuelle.
    Admettons que dans une boucle infinie, je fait new int, delete. Quand je delete, et que je réalloue avec le new un objet de meme taille, meme si la memoire est fragmentée, les fragments vides ont la meme taille que l'objet que je veux allouer, donc il devrait pouvoir etre allouer.
    J'ai l'impression que quand on fait new et delete, une addresse virtuelle déja utilisée une fois avec le new, n'est jamais "libérée".
    Pouvez-vous m'éclaircir la dessus svp
    Merci

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Quand tu fais un delete sur la mémoire, ca appelle le destructeur de ton objet et tu te contente de dire à l'os que la mémoire est dispo et qu'il peut en faire ce qu'il veut. Il peut juste le noter, mettre la mémoire à zéro, te la redonner si tu en redemande, ...

    On ne peut tirer aucun comportement général, tout va dépendre de l'os, c'est lui le chef.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Points : 27
    Points
    27
    Par défaut
    Merci pour ta reponse, mais cela n'explique pas pourquoi au bout d'un certain temps, quand on fait new/delete, on a plus de mémoire virtuelle.
    J'aimerais bien comprendre

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par kaiser92 Voir le message
    Merci pour ta reponse, mais cela n'explique pas pourquoi au bout d'un certain temps, quand on fait new/delete, on a plus de mémoire virtuelle.
    J'aimerais bien comprendre
    C'est ce que je disais. Tu semble ne plus avoir de mémoire virtuelle. Je n'ai jamais eu ce problème avec les codes que tu montres dans un autre sujet. Sans précisions sur ton OS on ne peut rien dire.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par kaiser92 Voir le message
    Merci pour ta reponse, mais cela n'explique pas pourquoi au bout d'un certain temps, quand on fait new/delete, on a plus de mémoire virtuelle.
    J'aimerais bien comprendre
    ?? Comme david, si on connait pas ton os on pourrait pas dire grand chose. Mais en ce qui me concerne c'est rare que j'ai a utilisé le swap...
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Points : 27
    Points
    27
    Par défaut
    Mon OS est win32 XP, c'est un probleme connu, tu le vois avec performance monitor, les privates bytes, memoire physique et virtual bytes = memoire virtuelle.
    Avec ce genre de boucle new/delete infinie, la memoire physique est en dents de scie, ce qui est normal, allocation/deallocation, mais la memoire virtuelle augmente graduellement, jusqu'a ce que ton new plante, plus de memoire virtuelle.
    Ma question est pourquoi donc la memoire virtuelle n'est jamais libérée?
    J'aimerais comprendre ces mecanismes de memoire virtuelle, et commencant par ce topic ca m'aiderais beaucoup.
    Merci

  7. #7
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par kaiser92 Voir le message
    Mon OS est win32 XP, c'est un probleme connu, tu le vois avec performance monitor, les privates bytes, memoire physique et virtual bytes = memoire virtuelle.
    Avec ce genre de boucle new/delete infinie, la memoire physique est en dents de scie, ce qui est normal, allocation/deallocation, mais la memoire virtuelle augmente graduellement, jusqu'a ce que ton new plante, plus de memoire virtuelle.
    Ma question est pourquoi donc la memoire virtuelle n'est jamais libérée?
    J'aimerais comprendre ces mecanismes de memoire virtuelle, et commencant par ce topic ca m'aiderais beaucoup.
    Merci
    Ce qu'on essaye de te dire, c'est que c'est à voir avec ton OS, ca rien à voir avec le C++. Il faut poster dans le forum Windows.

    Si tu veux comprendre toutes les histoires de mémoire virtuelle, réelle et co, il te faut un cours sur les OS et Wikipedia.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Points : 27
    Points
    27
    Par défaut
    ca a aussi a voir avec le c++, car quand tu fait un new/delete, il faut quand meme connaitre un minimum ce qu'il se passe en dessous.
    Et puis tous les OS modernes ont ce concept de memoire virtuelle.
    Donc le mettre ici ce post servira a tout le monde, les developpeurs Mac, Win32, iPhone, ...
    J'aurais bien plus de chances d'avoir des reponses ici que dans un forum Win32.
    Il s'agit d'un probleme valable pour tous les OS
    Kaiser

  9. #9
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par kaiser92 Voir le message
    ca a aussi a voir avec le c++, car quand tu fait un new/delete, il faut quand meme connaitre un minimum ce qu'il se passe en dessous.
    New réserve la mémoire (malloc) et ca appelle le constructeur. Pas besoin de savoir plus. En dessous (la réservation de la mémoire) c'est de la programmation système et c'est dépendant de l'OS.

    De plus, le C++ n'a pas de notion de mémoire virtuelle ou réelle. Ca na rien à voir avec le langage.

    Donc le mettre ici ce post servira a tout le monde, les developpeurs Mac, Win32, iPhone, ...
    Nan, puisque chaque os gère sa mémoire de sa propre façon.

    Citation Envoyé par kaiser92 Voir le message
    Il s'agit d'un probleme valable pour tous les OS
    Ton expérience de "perte de mémoire virtuelle" n'a pas avoir avec tous les OS puis que tous ont des gestion de la mémoire différente. Sous linux, je n'ai jamais eu ce problème.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 570
    Points
    41 570
    Par défaut
    Peux-tu poster ton code de test, pour commencer? Je flaire un problème de new[]/delete...

    PS: Pour la mémoire physique, avec sa gestion paginée, le terme "fragmentation" n'a pas vraiment de sens.
    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.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Points : 27
    Points
    27
    Par défaut
    Donc finalement l allocateur systeme new/malloc et free/delete est trop lent, il faut dans ce cas allouer une fois un gros bloc memoire et faire son propre new/delete pour puiser dedans au lieu d allouer betement a chaque fois.
    Merci de vos commentaire en tout cas, ca m a mis sur la piste pour trouver une solution viable

  12. #12
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    En pratique les new/delete malloc/free ne demandent pas directement à l'os de fournir de la mémoire. Tous les compilos intègrent un memory pooler généraliste. Si à chaque new/malloc delete/free correspondait un appel système à l'os (GlobalAlloc et GlobalFree par exemple sous Windows) je pense que les performances seraient catastrophiques (mais j'ai pas essayé pour comparer).

  13. #13
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Un programme ne connait pas la mémoire physique. La seule chose qu'il voit, c'est la mémoire virtuelle. D'ailleurs, la mémoire virtuelle, c'est pas non plus l'espace disque virtuelle.
    Par contre, le mieux serait que tu nous disent clairement ton environnement de développement (OS + Compilateur).
    Comme dis précédemment, généralement les compilateurs intègrent un gestionnaire mémoire. Il pourrait que se soit un bug de celui-ci.
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 91
    Points : 27
    Points
    27
    Par défaut
    je travaille sur XP SP2, avec VS 2005, ce probleme de rapidité de new/malloc est resolu avec un gros VirtualAlloc, puis chaque allocation utilise directement une partie de ce block, j'ai tester et c'est exterement plus rapide qu'un new/malloc, sans compter la fragemententation de l espace memoire virtuel.
    C'est la raison pour laquelle j ai clos ce post.
    Merci en tout cas de votre aide, j'ai ouvert d'autres posts pour avancer encore plus dans ce domaine.

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

Discussions similaires

  1. [PHP 5.3] Requete Delete dans une boucle
    Par Invité dans le forum Langage
    Réponses: 1
    Dernier message: 01/03/2013, 16h22
  2. Dans une boucle, delete sans next
    Par Just-Soft dans le forum Bases de données
    Réponses: 4
    Dernier message: 18/11/2008, 09h31
  3. [Tableaux] DELETE dans une boucle
    Par mikedimoi dans le forum Langage
    Réponses: 5
    Dernier message: 15/01/2006, 18h16
  4. [Vb.net] Indexé un objet crée dans une boucle
    Par picpic dans le forum Windows Forms
    Réponses: 10
    Dernier message: 17/12/2003, 14h37
  5. Pause dans une boucle
    Par HT dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2003, 08h52

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