valeur de retour d'un new ?

valeur de retour d'un new ? - C++ - Programmation

Marsh Posté le 16-10-2002 à 12:28:28    


Jusqu'à présent je testais toujours le retour d'un new avec NULL pour voir si l'allocation a réussi. Mais je viens de lire que ca ne servait a rien car si l'allocation echoue une exception est lancee et la valeur de retour de new n'etait pas initialisée à NULL. C'est ce que dit apparemment la norme du C++. Mais dans tous les cours que j'ai lus soit new est testé avec NULL sans explication soit il est dit que la majorité des compilos le font donc pas de probleme.
De plus, dans la MSDN il est dit que new retourne NULL en cas d'echec ce qui me va pour le moment car j'utilise principalement VC++. Mais bon le jour ou je change de compilo ou de systeme je voudrais pas devoir tout modifier.
Donc, je peux continuer à tester avec NULL sans problème ou faut gerer l'exception ?
 
Merci.
 

Reply

Marsh Posté le 16-10-2002 à 12:28:28   

Reply

Marsh Posté le 16-10-2002 à 12:36:25    

Bah si new ne te retourne pas d'adresse valide, c'est qu'il te retourne 0x00000000 (donc c'est NULL)
Il ne peut pas te retourner autre chose.
 
Maintenant il y a surement plusieurs façons de détecter un bug, mais si assert te convient, alors ne change pas :)

Reply

Marsh Posté le 16-10-2002 à 12:46:20    

leneuf22 a écrit a écrit :

Bah si new ne te retourne pas d'adresse valide, c'est qu'il te retourne 0x00000000 (donc c'est NULL)
Il ne peut pas te retourner autre chose.
 
Maintenant il y a surement plusieurs façons de détecter un bug, mais si assert te convient, alors ne change pas :)




 

Citation :


[16.5] Doit-on vérifier que p n'est pas NULL après un p = new Fred()?  
Non! (Mais si vous avez un vieux compilateur, vous devrez peut-être forcer le compilateur à se comporter ainsi).
 
Il est vraiment galère d'avoir à tester explicitement le pointeur NULL après chaque allocation par new. Devoir écrire du code comme celui ci-dessous est plutôt pénible:
 
    Fred* p = new Fred();
    if (p == NULL)
      throw bad_alloc();
 
Et c'est encore plus pénible si votre compilateur ne supporte pas les exceptions (ou si vous ne voulez pas les utiliser):
 
    Fred* p = new Fred();
    if (p == NULL) {
      cerr << "Couldn't allocate memory for a Fred" << endl;
      abort();
    }
 
Mais heureusement, si à l'exécution le système ne peut pas allouer sizeof(Fred) octets lors d'une instruction p = new Fred(), C++ lancera une exception bad_alloc. Contrairement à malloc(), new ne retourne jamais NULL!
 
Écrivez-donc simplement:
 
    Fred* p = new Fred();    // Pas la peine de vérifier si p vaut NULL
 


 
[url]http://www.ifrance.com/jlecomte/c++/c++-faq-lite/freestore-mgmt-fr.html#[16.5][/url]
 
Voila, donc d'apres eux new ne retourne jamais NULL !

Reply

Marsh Posté le 16-10-2002 à 12:53:40    

Sous MFC, en effet, tu peux ecrire:

Code :
  1. TRY
  2. {
  3.     pObject = new CMyObject();
  4. }
  5. CATCH(CMemoryException,e)
  6. {
  7.     // Handle error
  8. }
  9. END_CATCH


 
De toute façon, si le new echoue, y'a de forte chance que l'utilisateur n'arrive pas à faire grand chose avec ton programme, c'est que le système est complètement out of memory. Souvent y'a d'autre applies qui vont cracher avant la tienne!
 
Le seul gros avantage des exceptions, c'est comme d'hab, de simplifier le code, et de faire un seul catch à haut niveau, sans te soucier à plus bas niveau du control de la valeur de retour de chaque allocation. Le code est donc plus condensé, plus lisible, et plus robuste. Aucun risque d'oublier de controler un new.


Message édité par YungMakko le 16-10-2002 à 12:55:11

---------------
In tartiflette, we trust!
Reply

Marsh Posté le 16-10-2002 à 12:56:55    

hellbilly  
Précision très interessante!


Message édité par YungMakko le 16-10-2002 à 12:58:05

---------------
In tartiflette, we trust!
Reply

Marsh Posté le 16-10-2002 à 15:17:59    

ok merci pour ces precisions

Reply

Marsh Posté le 16-10-2002 à 15:31:34    

new(nothrow) retourne NULL en cas de Pb d'allocation et ne genere pas d'exception....

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed