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 :

VirtualAlloc et fuites memoires


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 VirtualAlloc et fuites memoires
    Bonjour a tous,
    je fais un simple main "new int", sans delete, et j appelle
    _CrtDumpMemoryLeaks juste avant la fin du main.
    Ca m affiche dans le output, un block de 8 octets non desaoulle, ce qui est parfait.
    Par contre quand je fait virtualAlloc, qui reserve la memoire aussi, DumpMemoryLeaks n affiche rien, pourtant il existe une methode VirtualFree. Donc je me demande bien pourquoi y a pas de fuites memoires dans ce cas precis.
    Merci d avance chers forumers

  2. #2
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    http://msdn.microsoft.com/en-us/libr...8VS.80%29.aspx

    et surtout :

    By default, internal C run-time blocks (_CRT_BLOCK) are not included in memory dump operations. The _CrtSetDbgFlag function can be used to turn on the _CRTDBG_CHECK_CRT_DF bit of _crtDbgFlag to include these blocks in the leak detection process.
    Je pense que ça vient de là. En tout cas, la détection de memory leaks étant fortement liée à l'allocateur mémoire, ce n'est pas étonnant que par défaut ça ne fonctionne pas si tu n'alloues pas avec malloc/free (ce que fait new).

  3. #3
    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
    Citation Envoyé par kaiser92 Voir le message
    Bonjour a tous,
    je fais un simple main "new int", sans delete, et j appelle
    _CrtDumpMemoryLeaks juste avant la fin du main.
    Ca m affiche dans le output, un block de 8 octets non desaoulle, ce qui est parfait.
    Par contre quand je fait virtualAlloc, qui reserve la memoire aussi, DumpMemoryLeaks n affiche rien, pourtant il existe une methode VirtualFree. Donc je me demande bien pourquoi y a pas de fuites memoires dans ce cas precis.
    Merci d avance chers forumers
    Je pense qu'il y a une méconnaissance du sujet.
    D'un coté l'OS, de l'autre le compilateur et "tout ce qu'il fait en cachette". Les fonctions proposées par le compilateur pour détecter les fuites de mémoire ne concernent que les appels passant par le gestionnaire de mémoire du compilateur (à priori uniquement new/delete et malloc/calloc/realloc/free), aucunement les appels système.
    VirtualAlloc est un appel système.

  4. #4
    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
    En fait je pose cette quesion car je travaille sur le Boehm GC, qui fait uniquement des VirtualAlloc sans faire les VirtualFree du tout, donc je voulais savoir si le systeme libere la memoire quand le main retourne, c est ce que j ai cru comprendre en lisant les commentaires du code.
    Je veux juste en etre sur.
    Merci

  5. #5
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    C'est pas beau de pas libérer, mais oui, sur les systèmes modernes, lorsqu'un processus meurt, tout l'espace mémoire qu'il occupait est libéré.

    Ce n'était pas le cas sous windows 95, par exemple...

  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
    il me semble que quand tu fait des new sans les deleter, quand l application se termine la memoire physique est encore occupée.
    Et quand tu fait dans une boucle new/delete par exemple, la memoire virtuelle diminue, et meme avec le delete, cette memoire virtuelle n'est pas libérée, c'est l'objet d un de mes posts VAS fragmentée.
    Peut etre qu'a cause de ca, VirtualAlloc avec certains parametres, n 'a pas besoin d etre libérée, puisque la memoire virtuelle ne se libere pas quand l application se termine, mais quand Windows decide de la liberer.
    Je trouverais etonnant que le Boehm GC ne fasse pas de VirtualFree, alors qu'il est utilisé par des milliers de personnes, et que j'utilise une version 7.1 hyper stable.
    Certainement une raison pour ca.

  7. #7
    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
    Décidément, tu as du mal avec mémoire physique/virtuelle oO.

    Physique = tes barrêtes de ram, virtuelle = ce que l'OS te fais voir (au travers de OS est aussi du MMU). Autant dire que la physique, tu n'est pas près d'y toucher.

    Et personnellement, avec MINGW 4.4.0 sous XP SP2, j'ai pas ce genre de problème >< de "fragmentation" (mot totalement inapproprié, parle plutôt de fuite) mystère.

    Tout processus est ces ressources sont contrôler par l'OS. Aussi va-t-il les récupérer s'il estime cela nécessaire. C'est généralement le cas à la fin d'un programme...
    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

  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
    je pense avoir suffisament fait de recherche pour te dire clairement que new/delete en boucle ne libere pas l'espace virtuel.
    Fait ca dans une boucle infinie le soir avant de quitter le bureau et revient le lendemain tu verra que tu devra rebooter ton PC car ta memoire virtuelle sera pleine.
    Ta memoire physique est allouee/liberee, en dents de scies.
    Y a le concept de private bytes et virtual bytes.
    Est-tu en mesure de me dire si VirtualAlloc sans VirtualFree est mal? car le Boehm GC le fait non stop.
    Voila

  9. #9
    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
    J'y vois aucun problème. Le truc, c'est qu'il n'alloue que lorsqu'il en a besoin. Si jamais il récupérer de la mémoire, il la met dans son pooler interne et attends d'en avoir besoin. Si y en a pas besoin, ben il "libère" la mémoire qu'à la fin du programme !

    [EDIT] Toute fois, je n'aime pas ce genre de comportement, qui pousse à la pénurie stupide sur des programmes qui tourne "longtemps".
    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

Discussions similaires

  1. Réponses: 4
    Dernier message: 31/10/2008, 08h31
  2. fuite memoire avec sfml
    Par themulot dans le forum SFML
    Réponses: 2
    Dernier message: 27/11/2007, 10h25
  3. [2.0] Comment tracer les fuites mémoire ?
    Par StormimOn dans le forum C++/CLI
    Réponses: 9
    Dernier message: 02/11/2007, 07h22
  4. [java] fuite memoire quand 2 process!
    Par vince3320 dans le forum Langage
    Réponses: 6
    Dernier message: 01/03/2007, 16h50
  5. [VC++6] probleme fuite memoire CLIST ?
    Par athilla dans le forum MFC
    Réponses: 16
    Dernier message: 22/11/2005, 16h01

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