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 :

[Mémoire] Malloc , petite question


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 371
    Points : 65
    Points
    65
    Par défaut [Mémoire] Malloc , petite question
    Bonjour,

    J'ai une classe , qui s'appelle B on va dire ...
    Elle a un attribut de type char *toto ...

    Dans une methode de la classe B, quon appelera test , je fais un alloc , pour allouer un espace de 10 caracteres par exemple.

    suite a ca je stocke dans cette derniere "123456789" , ridicule je sais mais bon

    puis fin de la methode ...

    Ma question , ou et quand libere on la memoire ?

    A la fin de ma methode test ? toto ne contiendra donc plus "123456789" ?
    ou a la prochaine initialisation si la taille du char * change ?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    La réponse n'est pas simple du tout et dépend aussi de l'utilisation que tu veux faire de ta classe.

    C'est pour cela qu'en C++ on utilise des std::string pour gérer les chaînes de caractères et non des char*.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class A
    {
       std::string toto_;
    };
    et tout est libéré/alloué quand il le faut.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Si tu te mets bel et bien dans le contexte d'une classe (ou d'une structure) qui dispose d'un champs qui est en réalité un pointeur sur quelque chose que tu alloues de manière dynamique (mais de préférence avec new, et non avec malloc), la libération de la mémoire doit se faire - en dehors des cas où la durée de vie du membre doit être indépendante de la durée de vie de l'élément qui le contient - dans le destructeur.

    Cependant, il y a alors lieu de prendre quelques précautions, car tu pourrait en arriver à la situation suivante qui serait catastrophique:
    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
    class MaClass
    {
        public:
            /* le constructeur */
            MaClass(size_t size):size(size)
            {
                member = new Type[size];
            }
            /* nous ne déclarons ni le constructeur de copie ni l'opérateur
             * d'affectation... Le résultat est que le compilateur en crée qui
             * prennent une implémentation par défaut dangeureuse
             */
            ~MaClass()
            {
                delete[] member;
            }
        private:
            Type* member;
    }
    utilisée dans le contexte suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void foo()
    {
        MaClass  mavar(10); //création "normale" de la variable
        /* ... quelques linges plus loin, dans un bloc, par exemple, dans un test */
        if (test)
        {
            MaClass c2 = mavar /* DANGER, tout semble aller bien mais */
        }    // c2 est détruit ici
       /* hors, l'adresse pointée par mavar.member est la meme que celle
        * pointee par c2.member
        */
     
    } // BOUM... la mémoire allouée à maclass.member a été libérée
      // lorsque l'on a détruit c2...
    Tu dois donc veiller, selon le cas, à
    • rendre ta classe non copiable et non assignable (ce qui est sans doute la solution qu'il faut envisager en premier)
    • veiller à ce que la copie et l'assignation fassent de manière à ce que member ne pointe pas deux fois sur la meme adresse (ce qui sous entend d'allouer de la mémoire pour le membre de l'objet "copie")
    • utiliser un "compteur de références" capable de vérifier que la mémoire ne soit libérée que lorsque la dernière occurence de la variable est détruite
    • utiliser un type de pointeur dit "intelligent" tel que, par exemple, le shared_ptr
    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
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Tu peux regarder du côte de la FAQ ou encore ce tuto sur les pointeurs. Je pense que ces éléments pourront participer à ta réflexion sur la gestion des pointeurs.

Discussions similaires

  1. Gestion de la mémoir, petite question.
    Par Djobird dans le forum Langage
    Réponses: 8
    Dernier message: 03/07/2007, 12h03
  2. Petite question rapide sur allocation mémoire
    Par adn013 dans le forum Langage
    Réponses: 5
    Dernier message: 11/06/2007, 16h10
  3. Réponses: 6
    Dernier message: 07/05/2006, 21h42
  4. [Visuel XP] Petite question sur le theme XP...
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 12
    Dernier message: 20/01/2005, 14h41
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

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