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 désallocation mémoire


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 105
    Par défaut Allocation désallocation mémoire
    Bonjour à tous,
    une question simple pour la majorité d'entre vous, mais qui n'est pas trop claire pour moi.

    Je crée des objets en C++ avec la même variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    T* varCourante;
    varCourante = new T();
    ...
    varCourante = new T();
    ...
     
    varCourante = new T();
    Est ce que quand il s'agit de la même variable, allouée plusieurs fois de suite, il faudrait d'abord desallouer pour faire une nouveau new ?
    Merci pour votre aide.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Ça dépend ce que tu fais du pointeur.
    Si mets chaque pointeur dans une liste, alors tu n'as pas à désallouer varCourante tant que le pointeur est dans la liste.

    Si varCourante est la seule variable à contenir l'adresse de l'objet alloué, alors tu dois désallouer avant d'écraser l'adresse en question avec une autre.
    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
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Le principe est toujours que, pour chaque new invoqué, il faut un delete correspondant avant de prendre le risque de perdre l'adresse à laquelle l'allocation a eu lieu, pour éviter le risque de fuites mémoires ("memory leaks").

    Contrairement à d'autres langages (java et C#, par exemple), le C++ estime que si tu est "assez fou" pour demander une allocation dynamique, c'est que tu es en mesure de gérer toi même la libération de la mémoire en temps et en heure.

    Si donc tu insère la variable qui représente ton pointeur dans un conteneur (que ce soit un vecteur, une liste, ou un conteneur associatif), tu peux envisager de n'invoquer delete que lors de la suppression de l'élément du conteneur (et au plus tard lors de la destruction du conteneur).

    Si, par contre, tu ne place pas la variable qui représente ton pointeur dans un conteneur, il faut que tu libère la mémoire avant d'effectuer une nouvelle allocation dynamique de la mémoire pour le même pointeur (mais une fois que tu es sur que tu n'auras plus besoin d'accéder au pointeur).

    Personnellement, plutot que de "dérouler" le code, je verrais bien plutot une boucle sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    T* mavar;
    while(test) /* aurait très bien pu être une boucle for ou un do while ;) */
    {
        /* récupération des informations permettant de créer l'objet */
        mavar = new T (/* arguments */);
        /* traitement avec les nouvelles valeurs */
        delete mavar;
    }
    Ceci dit, le C++ fournit une quantité impressionnante de possibilités d'éviter l'allocation dynamique de la mémoire, ce qui fait que, au final, il ne reste que quelques cas dans lesquels tu sois obligé d'y avoir recours.

    A l'heure actuelle, il n'y a plus que trois gros cas dans lesquels on aura recours à l'allocation dynamique seront:
    • Si le membre de la classe peut ne pas exister (et doit donc être créé plus tard par une méthode ad-hoc)
    • Si le membre doit subsister après la destruction de l'instance dans laquelle il est créé (il faudra alors s'assurer qu'il soit effectivement détruit en temps utile)
    • Si on veut mettre en œuvre le polymorphisme

    Dans tous les autres cas, le recours aux différents conteneurs (pour la gestion de plusieurs éléments) ou aux références (pour éviter la copie d'une variable et/ou pour permettre aux modifications apportées à cette variable de persister après la fonction dans laquelle les modifications sont apportées) seront des alternatives réelles.
    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
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 105
    Par défaut
    j'ai pensé utiliser une référence; mais on ne peut pas déclarer une référence comme une variable membre en C++, ce qui est le cas par exemple dans java.

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    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 292
    Par défaut
    Bien sûr que si -- si tu n'y arrives pas, c'est parce que tu es passé à côté des listes d'initialisation.
    Mais une référence en C++ n'a rien avoir avec les références du Java
    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...

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Réfléchis d'abord à pourquoi tu utilises des pointeurs. Ne peux-tu pas tout simplement mettre tes variables sur la pile d'exécution ?

Discussions similaires

  1. allocation/désallocation de mémoire
    Par kinta dans le forum C++
    Réponses: 2
    Dernier message: 10/02/2006, 09h52
  2. Problème d'allocation de mémoire dans la pile
    Par prophet666 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 19/01/2006, 02h22
  3. [Debutant]Allocation de mémoire
    Par gwendal84 dans le forum C
    Réponses: 6
    Dernier message: 07/12/2005, 19h04
  4. Double allocation de mémoire
    Par hunter001 dans le forum C++
    Réponses: 16
    Dernier message: 25/08/2005, 13h53
  5. pb d'allocation de mémoire
    Par shura dans le forum C
    Réponses: 7
    Dernier message: 17/04/2005, 21h10

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