lundi 7 juillet 2008

Tester le retour du "new" en C++

Bonjour,

Couramment les développeurs C++ se demandent s'il faut où pas tester le retour d'une tentative d'allocation dynamique, autrement dit :
Faut-il tester le retour du "new" en C++ ?
Faut-il vérifier que l'adresse retournée n'est pas nulle (valeur NULL) ?

A cette grande question il n'existe malheureusement pas qu'une seule réponse.

En fait c'est plus compliqué qu'il n'y paraît et le langage C++ n'est pas sensé retourner nécessairement une valeur nulle en cas d'échec (en effet le système d'exploitation peut ne pas vous donner la mémoire afférente à la demande !).

En fait en C++ il existe :

1. new
2. new(std::nothrow)

Le "new" simple ne retourne pas NULL mais une exception du type "std::bad_alloc". C'est assez surprenant et chacun ne s'attend pas en général à cette révélation.

exemple :

try
{
p = new X;
}
catch (std::bad_alloc &ex)
{
std::cout << "Echec d'allocation mémoire sur la heap";

}

L'exemple C++ ci-dessus montre comment l'on devrait tester la possibilité d'un échec d'allocation sur le tas (heap en anglais). Si vous persistez néanmoins dans votre idée de test du "new" à la valeur nulle (NULL) alors il convient d'utiliser cette recette :

X * _p;
_p = new(std::nothrow) X;

if (NULL == _p)
{
std::cout << "Echec d'allocation mémoire sur la heap";

}

Voilà le principal est dit, le C++ est décidemment parfois surprenant et moralité il faut se méfier des croyances populaires.

Heureusement la plupart des compilateurs soutiennent la croyance populaire et c'est bien ainsi.

Le débat est ouvert ...

Amicalement,

Aucun commentaire:

Enregistrer un commentaire