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 :

Allocation dynamique de mémoire.


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 142
    Points : 109
    Points
    109
    Par défaut Allocation dynamique de mémoire.
    Bonjour,
    Je me demande ce qui se passe réellement lors de l allocation dynamique de mémoire et sa libération...
    J imagine que lors de l utilisation d un , l'OS est mis a contribution.
    Le programme que l on écrit doit bien a un moment donné demander poliment a l os si ma machine dispose de la place nécessaire pour stocker quelquechose.
    Et quand j'ecris mon l'OS est informé qu il peut redisposer comme il l entend de cet espace mémoire.
    Je comprends donc assez bien pourquoi il faut libérer la mémoire lorsqu on ecrit un programme qui tourne indéfiniment comme celui-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main()
    {
     int *p;
     while(true) p=new int;
    }
    Par contre si j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main()
    {
     int* p;
     for(int i=0 ; i<10; ++i)
       p=new int;
    }
    Ce dernier programme se terminant, il doit bien en informer l'OS.
    Est ce qu'alors l'OS récupère la mémoire non libérée par ce dernier programme ou est-elle définitivement hors d'atteinte ?
    En d'autres termes.... en faisant tourner en boucle quelques milliards de fois mon dernier programme est ce que je vais épuiser la mémoire de ma machine ?
    Ou encore en d'autres termes, si j'écris un programme dont je sais qu'il va s arreter et utiliser une quantité "raisonnable" de mémoire lors de son fonctionnement est ce que je peux oublier des delete en toute 'sécurité' ?

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par BaygonV Voir le message
    Bonjour,
    Je me demande ce qui se passe réellement lors de l allocation dynamique de mémoire et sa libération...
    J imagine que lors de l utilisation d un , l'OS est mis a contribution.
    On va dire oui, pour simplifier.

    Citation Envoyé par BaygonV Voir le message
    Le programme que l on écrit doit bien a un moment donné demander poliment a l os si ma machine dispose de la place nécessaire pour stocker quelquechose.
    Et quand j'ecris mon l'OS est informé qu il peut redisposer comme il l entend de cet espace mémoire.
    De manière surprenante, non, pas dans tous les cas. Pour les grosses zones allouée, l'OS va être avertit qu'il faut les libérer. Pour les petites zones allouées, on préfèrera les garder dans le contexte du processus courant, de manière à ne pas perdre de temps à la prochaine petite allocation.

    Citation Envoyé par BaygonV Voir le message
    Je comprends donc assez bien pourquoi il faut libérer la mémoire lorsqu on ecrit un programme qui tourne indéfiniment comme celui-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main()
    {
     int *p;
     while(true) p=new int;
    }
    Par contre si j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main()
    {
     int* p;
     for(int i=0 ; i<10; ++i)
       p=new int;
    }
    Ce dernier programme se terminant, il doit bien en informer l'OS.
    Est ce qu'alors l'OS récupère la mémoire non libérée par ce dernier programme ou est-elle définitivement hors d'atteinte ?
    La mémoire associée à un processus est entièrement libérée lorsque ce processus se termine.

    Citation Envoyé par BaygonV Voir le message
    En d'autres termes.... en faisant tourner en boucle quelques milliards de fois mon dernier programme est ce que je vais épuiser la mémoire de ma machine ?
    De fait, non.

    Citation Envoyé par BaygonV Voir le message
    Ou encore en d'autres termes, si j'écris un programme dont je sais qu'il va s arreter et utiliser une quantité "raisonnable" de mémoire lors de son fonctionnement est ce que je peux oublier des delete en toute 'sécurité' ?
    Oui, mais c'est ce qu'on va appeler une Mauvaise Pratique de Programmation. Tu n'es pas non plus à l'abris d'un bug qui pourrait corrompre des données importantes silencieusement - et qui aurait été visible (segfault, access violation) si la mémoire avait été libérée. Maintenant, si ton programme a un temps d'exécution court et ne consomme que relativement peu de ressources, alors oui, tu peux oublier les delete. Pense par contre à ne jamais montrer ce code à ton chef de projet, sous peine de prendre des coups de règle sur les doigts...
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par BaygonV Voir le message
    Ou encore en d'autres termes, si j'écris un programme dont je sais qu'il va s arreter et utiliser une quantité "raisonnable" de mémoire lors de son fonctionnement est ce que je peux oublier des delete en toute 'sécurité' ?
    Ne pas delete un objet = pas d'appel au destructeur, ce qui peut, dans certains cas, être problématique.
    Les smart pointers (std::unique_ptr, std::shared_ptr ...) peuvent se charger de la libération de la mémoire pour toi.

  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
    Pour ta première question: Réponse courte: Oui, réponse longue: Il peut y avoir une couche entre le new et l'OS, pour allouer plus de mémoire d'un coup pour plusieurs new, afin de réduire le nombre de couteux appels à l'OS.

    Pour ta seconde question: Sur tout OS moderne, oui, l'OS récupère toute la mémoire à la fin d'un processus. Sur certaines vieilles plate-formes, plate-formes embarquées, ou vieilles plate-forme embarquées, la mémoire est perdue jusqu'au prochain reboot (exemple: Calculatrices programmables de la famille TI-89, où les zones mémoire allouées par un programme en assembleur n'étaient pas libérées automatiquement à la fin de celui-ci)
    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.

Discussions similaires

  1. probleme d'allocation dynamique de mémoire
    Par Blo0d4x3 dans le forum C
    Réponses: 2
    Dernier message: 13/03/2007, 07h53
  2. Allocation dynamique de mémoire : Limitations ?
    Par rulianf dans le forum C++
    Réponses: 5
    Dernier message: 22/03/2006, 17h03
  3. Allocation dynamique de mémoire
    Par cd090580 dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 12/11/2005, 11h17
  4. [VC++/ASM] Allocation dynamique de mémoire ?
    Par Magus (Dave) dans le forum x86 32-bits / 64-bits
    Réponses: 7
    Dernier message: 21/12/2004, 15h05
  5. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31

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