[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