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 :

[Débutant] Constructeur ~Destructeur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Par défaut [Débutant] Constructeur ~Destructeur
    Bonjour,

    Concernant les constructeurs et les destructeurs j'ai lu sur un forum (peut être ici) que le fait d'utiliser new peux entrainer des fuites mémoires!!

    Ma question est quelle est la meilleur façon de construire et détruire un objet?

    J'ai un peu de mal avec ce concept? le jour où il y aura un garbage collector....


    Est ce que ceci est bon?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    maClasse::maClasse(int unEntier, char* unPointeurChar)
    {
        unEntier = 3;
        unPointeurChar = "aa";
    }
     
    maClasse::~maClasse()
    {
        delete[] entier, unPointeurChar;
    }
    Avec un header qui déclare ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class maClasse
    {
      public :
        maClasse();
        ~maClasse();
     
      private :
        int unEntier;
        char *unPointeurChar;
    }
    Merci!

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Par défaut
    ben oui:
    si tu as

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class maClasse
    {
      public :
        maClasse();
        ~maClasse();
     
      private :    
        char *unPointeurChar;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    maClasse::maClasse(int unEntier, char* unPointeurChar)
    {
        unEntier = 3;
        unPointeurChar = "aa";
    }
     
    maClasse::~maClasse()
    {
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(;;)
    {
     maClase();
    }
    a chaque passage de boucle il y a 2 octets qui sont perdus.

    En règle générale, évite d'utiliser les new/delete...
    Ou alors assure toi bien de faire un delete sur le pointeur attribut.

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Par défaut
    oups je me suis planté de constructeur mais tu as compris

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 73
    Par défaut
    Tout d'abord, le code que tu proposes ne contient aucun new, donc aucune allocation de mémoire : inutile donc de la libérer.

    Cependant, si dans ton constructeur tu allouais de la mémoire, par exemple pour ton char * (soit dit en passant, affecter "aa" à un pointeur ne signifie rien : un pointeur est une adresse), alors il faudrait penser à libérer celle-ci dans ton destructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    MaClasse:MaClasse()
    {
        unPointeurChar = new char;
    }
     
    MaClasse:~MaClasse()
    {
        delete unPointeurChar;
    }
    Quant à l'autre syntaxe que tu utilises, elle sert à libérer la mémoire occupée par des tableaux. D'après ce que j'ai compris, ton char * est en fait une chaîne de caractères. Dans ce cas, tu dois allouer de la mémoire pour plusieurs char, de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MaClasse:MaClasse()
    {
        unPointeurChar = new char[10];
        unPointeurChar[0] = 'a';
        unPointeurChar[0] = 'a'; //La chaîne contient maintenant "aa", ainsi que des données
                                 //indéfinies dans les 8 caractères restants
    }
    Encore une fois, comme tu as alloué de la mémoire, tu dois la libérer. La syntaxe pour libérer la mémoire occupée par un tableau est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MaClasse:~MaClasse()
    {
        delete[] unPointeurChar;
    }
    Cependant, il me semble qu'il faudrait d'abord que tu apprennes la sémantique des pointeurs, ce qu'ils représentent, avant de t'occuper d'allocation et de désallocation.

  5. #5
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Par défaut
    Oui j'ai oublié d'utiliser des new, en faite c'était plus pour le principe...

    Je débute et donc ma syntaxe est encore imparfaite, mais si je suis amené à utiliser des new à tout va (je faisait du java avant) je préfère savoir comment m'en dépatouiller. J'ai pas envie de prendre de mauvaise habitude.


    En règle générale, évite d'utiliser les new/delete...
    Faut faire comment pour créer de nouvelles classes??


    Merci pour vos réponses.

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Par défaut
    ben quand tu fais appel à un constructeur de la classe, un objet est créé!
    pas besoin de faire des new à droite et à gauche...

    la durée de vie d'un objet n'excède pas le fichier ou les parenthèse

    c'est bon à rappeler:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void main()
    {
      {
      maclasse objet;
      //ici au debugger tu pourras voir l'objet
      }
    //ici il n'existe plus ^^
    }

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

Discussions similaires

  1. Constructeur & Destructeur en UML
    Par fredhali2000 dans le forum UML
    Réponses: 5
    Dernier message: 31/03/2006, 19h31
  2. [Débutant] Constructeur d'une classe
    Par chennuo dans le forum Langage
    Réponses: 2
    Dernier message: 10/03/2006, 22h17
  3. [JUnit] [Test][Débutant] Constructeur privé
    Par Shabata dans le forum Tests et Performance
    Réponses: 2
    Dernier message: 12/01/2006, 15h45
  4. [D7] constructeur / destructeur
    Par raoulmania dans le forum Langage
    Réponses: 2
    Dernier message: 16/12/2005, 18h00
  5. [Débutant]Constructeur et new/delete
    Par Geolem dans le forum C++
    Réponses: 5
    Dernier message: 02/12/2005, 21h11

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