[gull] cours C++

Marc Mongenet marc.mongenet at gmail.com
Sun Feb 26 00:50:33 CET 2006


Le 25/02/06, Marc SCHAEFER<schaefer at alphanet.ch> a écrit :
> On Sat, Feb 25, 2006 at 12:43:13PM +0100, Grossiord Yves wrote:
> > Pour info, l'implementation de new peut ressembler a ca:
> >     X* p = new X(2);
> > est equivalent a:
> >     struct X * p = (struct X *) malloc(sizeof(struct X));
> >     if (p == 0) error("memory exhausted");
> >     p->init(2);
> > Qu'est-ce que vous preferez ?
>
> Tiens, j'aurais pensé (sans avoir lu la norme), que cela aurait plutôt
> été:
>
>    if (p) {
>       p->init(2);
>    }
>
> de manière à avoir p NULL lorsque new ne fonctionne pas (contrairement à
> X p qui doit provoquer une erreur à l'exécution).
>
> Qu'en est-il, experts C++ ?  Une exception ?

Oui, l'exception std::bad_alloc est lancée.
Mais à l'époque, un pointeur nul était retourné.
Aujourd'hui, si l'on veut que new signale une erreur avec un pointeur nul
au lieu d'une exception, il faut appeler la version nothrow de new :

new (std::nothrow) char[4000000000U];

On peut encore noter que new appelle une fonction paramétrable
par la fonction std::set_new_handler en cas d'échec d'allocation.

Marc Mongenet



More information about the gull mailing list