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 mémoire (new) dans un constructeur


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 38
    Points
    38
    Par défaut Allocation mémoire (new) dans un constructeur
    Bonjour,

    Je dispose d'une classe X:

    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
    20
    21
    22
    23
    24
    25
     
    Class X
    {
        public:
        X();
        ~X();
     
        private:
        int *Var;
    }
     
    X()
    {
        Var = new (std::nothrow) int;
    }
     
    int main()
    {
        X *cX = new (std::nothrow) X();
        if(cX)
        {
            /*...*/
        }
        return 0;
    }
    Le new de la classe et le new qui se situe à l'intérieur du constructeur, sont-ils indépendants ? Que se passe t-il si le new situé à l'intérieur du constructeur échoue ? Est-ce que le new de la classe échoue également ?

    Etant donné que je suppose que non, le seul moyen pour vérifier que l'allocation s'est bien effectué pour la variable Var serait d'écrire une fonction membre qui permette de récupérer la variable Var et ainsi de pouvoir la tester dans le main. Y'a t-il une autre solution, comme par exemple pouvoir rendre le new de la classe dépendant des new qui composent son constructeur. Est-ce possible ?

    Cordialement,

    Julien.

  2. #2
    Membre confirmé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Points : 496
    Points
    496
    Par défaut
    Bonjour,
    J'ai du mal à comprendre ta question. Un constructeur qui échoue pour moi est un constructeur qui émet une exception. Un constructeur qui n'émet pas d'exeption est un constructeur qui a réussie à créer l'objet.
    Pour tester il faut juste mettre un try catch. Dans le catch faire un traitement en cas de non initialisation de la variable, ou un throw pour remonter l’exception.
    http://www.parashift.com/c%2B%2B-faq....html#faq-17.8

  3. #3
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Oui tes deux new sont indépendants.

    Non, comme tu utilises un new nothrow, si le new dans ton constructeur échoue alors la valeur de var sera mise à 0, mais le constructeur ne lancera pas, et donc le second new n'échouera pas (pour peu qu'il ai pu alloué de la mémoire).

    Pour ta dernière question, tes problèmes apparaisent parce que tu utilises des version nothrow et que tu n'utilises pas le RAII (scoped_ptr/unique_ptr par exemple), avec eux tes problèmes n'existent pas.

    D'autre part, non, je ne pense pas qu'exposer l'état de la variable var à l'extérieur de ta classe soit une bonne idée. En POO il ne faut pas penser les classes comme un ensemble de données et des fonctions qui changent/expose l'état de l'ensemble, mais comme un ensemble de service : ainsi on peut définir l'ensemble des données après sans avoir besoin de les exposer (puisqu'on a déjà identifier les services).

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    Ok merci !

    Julien.

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

Discussions similaires

  1. Allocation de pointeur dans le constructeur ou pas ?
    Par Beulard dans le forum Langage
    Réponses: 8
    Dernier message: 04/12/2010, 16h00
  2. Problème d'allocation mémoire dans un constructeur
    Par zaz83 dans le forum Débuter
    Réponses: 2
    Dernier message: 12/06/2009, 13h31
  3. [Pointeur] Allocation mémoire
    Par Rayek dans le forum Langage
    Réponses: 22
    Dernier message: 20/05/2005, 10h26
  4. Allocation mémoire dynamique
    Par ITISAR dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/01/2005, 09h59
  5. Capture d'exception dans un constructeur
    Par declencher dans le forum Composants VCL
    Réponses: 8
    Dernier message: 03/02/2004, 12h52

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