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 :

Quelle est la valeur du pointeur si new échoue ?


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Quelle est la valeur du pointeur si new échoue ?
    Bonjour à tous,

    J'ai pas mal cherché sur internet, mais n'ai rien trouvé de très clair à ce sujet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int * a = 0; 
    a = new int;
    Je sais que si l'allocation de la mémoire échoue, new renverra une exception de type std::bad_alloc. Mais si c'est le cas, quelle sera la valeur du pointeur ?

    J'ai cru comprendre qu'il serait du type "bad ptr".

    Puis-je faire un delete sur un tel pointeur ?

    Je me pose la question parce que j'ai fait un petit "système", qui gére la création de modules, au début du programme, dont voici le code :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    class Application;
     
    template <class C>
    class Module //: Uncopyable
    {
        friend class Application;
     
    private :
     
        static C * the_instance;
     
        static void Construct( void )
        {
            the_instance = new C;
        }
     
        static void Destruct( void )
        {
            delete the_instance;
     
            // juste au cas où ...
            the_instance = 0;
        }
     
    protected :
     
        Module( void )
        { }
     
        ~Module( void )
        { }
     
    public :
     
        static C& GetInstance( void )
        {
            return (*the_instance) ;
        }
     
    };
     
    template <class C>  C * Module<C>::the_instance = 0;
     
     
    class Renderer : Module<Renderer>
    {
        friend class Module<Renderer>;
     
        // code sans importance ...
    };
     
    class Application
    {
    private :
     
        Application( void )
        { }
     
        void ConstructModules( void )
        {
            Module<Renderer>::Construct();
            // etc...
        }
     
    public :
     
        ~Application( void )
        {
            // etc...
            Module<Renderer>::Destruct();
        }
     
        static void Initialize( void ) // sensé être appelée une seule fois :)
        {
            static Application instance;
     
            try
            {
                instance.ConstructModules();
            }
            catch( std::bad_alloc )
            {
                throw std::runtime_error("Failed to allocate memory...");
            }
        }
    };
     
    int main( void )
    {
        try
        {
            Application::Initialize();
        }
        catch( std::exception )
        {
            return 1; // appel du destructeur de application
        }
     
        Module<Renderer>::GetInstance().Render();
     
        return 0;
    }
    Désolé, ça fait un peu beaucoup de "code", pour pas grand chose.
    Mais, si new échoue, et que le destructeur de la classe Application, est appelé. Que va t-il se passer pour le pointeur sur lequel new a échoué ?

    Je sais que je pourrais utiliser la version de new qui n'envoie pas d'exceptions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <new> 
     
    int * a = new(std::nothrow) int;
     
    if( !a )
    {
        return false;
    }
     
    return true;
    Mais je préférerais, utiliser le mécanisme d'exceptions.

    Merci pour votre aide,

  2. #2
    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
    Bonsoir,

    Dans ton cas absolument rien, ca fera juste un delete sur un pointeur nul.

    Ton instruction "the_instance = new C;" n'est pas atomique, (écrire C() serait d'ailleurs un peu mieux, tu assures ainsi une initialisation pas defaut quelque soit le type C), elle se décompose en plusieurs instructions :
    - new C()
    - affectation du retour de new à the_instance
    (ces 2 opérations ne sont pas non plus nécessairement atomiques).

    Si new C() lance une exception il n'y a pas de retour à la fonction new, le "flux" d'instructions est coupé et reprend au bloc catch le plus "proche". Ainsi la valeur de the_instance est toujours 0, et finalement lors de la destruction de l'objet statique de type Application, le destructeur appel Destruct qui ne va faire qu'un delete sur un pointeur nul.

    PS: Les singleton c'est assez laid et sans grand interet ... (cf l'article de Emmanuel Deloget sur son blog par exemple).

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Bonsoir Flob90,

    Understood.

    En ce qui concerne le Singleton, j'avoue avoir encore un peu de mal.
    Je voulais utiliser cette méthode pour construire tous les modules nécessaires au programme, à un seul endroit.

    Mais bon, là n'est pas le sujet

    Merci en tout cas,

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

Discussions similaires

  1. Quelle est votre valeur d'achat?
    Par Lyche dans le forum La taverne du Club : Humour et divers
    Réponses: 24
    Dernier message: 22/12/2008, 16h26
  2. [W3C] Quelle est la valeur unicode du caractère •
    Par stars333 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 14/05/2007, 11h52
  3. quelle est cette valeur
    Par b4mail dans le forum C
    Réponses: 13
    Dernier message: 14/05/2006, 23h39
  4. Quelle est la grosseur d'un pointeur (FK)?
    Par sekiryou dans le forum Administration
    Réponses: 4
    Dernier message: 04/06/2005, 22h17

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