OVH Cloud OVH Cloud

throw

3 réponses
Avatar
Michel Champe
Bonjour,

J'ai vu les instructions suivantes dans un programme C++ :

void *operator new (RTRT_SIZE_T size) throw (std::bad_alloc)
{...
}

void operator delete (void *ptr) throw()
{....
}

Je comprends qu'il s'agit d'une redéfinition des opérateurs new et delete.
Cependant, à quoi servent les instructions throw se trouvant au niveau de la
définition de la fonction et non dans le corps de la fonction ?

Merci.

3 réponses

Avatar
Benoit Rousseau
Michel Champe wrote:
Bonjour,

J'ai vu les instructions suivantes dans un programme C++ :

void *operator new (RTRT_SIZE_T size) throw (std::bad_alloc)
{...
}

void operator delete (void *ptr) throw()
{....
}

Je comprends qu'il s'agit d'une redéfinition des opérateurs new et delete.
Cependant, à quoi servent les instructions throw se trouvant au niveau de la
définition de la fonction et non dans le corps de la fonction ?


A indiquer que la fonction peut lever une exception de type
std::bad_alloc si elle échoue

--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/

Avatar
Magnet
Benoit Rousseau racontait :
Michel Champe wrote:
Bonjour,

J'ai vu les instructions suivantes dans un programme C++ :

void *operator new (RTRT_SIZE_T size) throw (std::bad_alloc)
{...
}

void operator delete (void *ptr) throw()
{....
}

Je comprends qu'il s'agit d'une redéfinition des opérateurs new et
delete. Cependant, à quoi servent les instructions throw se trouvant
au niveau de la définition de la fonction et non dans le corps de la
fonction ?


A indiquer que la fonction peut lever une exception de type
std::bad_alloc si elle échoue


Par ailleurs, elles ne pourront faire remonter QUE des exceptions des
types indiqués.

Par exemple, si on veut empecher une fonction quelconque de faire
remonter une exception, on peut rajouter à sa signature (et tout à la
fin, après le qualificatif const) :
throw (void)

C'est ce que fait delete dans l'exemple ci-dessus, ce qui est tout à
fait normal car delete ne doit _jamais_ renvoyer d'exception. A moins de
changer le handler de new (set_new_handler), new renvoie
systématiquement std::bad_alloc quand il ne peut effectuer une
allocation (et donc, pas un pointeur nul).


--
Magnet


Avatar
Michel Champe
Merci pour ces infos....

"Magnet" a écrit dans le message de news:
br0bdk$25li$
Benoit Rousseau racontait :
Michel Champe wrote:
Bonjour,

J'ai vu les instructions suivantes dans un programme C++ :

void *operator new (RTRT_SIZE_T size) throw (std::bad_alloc)
{...
}

void operator delete (void *ptr) throw()
{....
}

Je comprends qu'il s'agit d'une redéfinition des opérateurs new et
delete. Cependant, à quoi servent les instructions throw se trouvant
au niveau de la définition de la fonction et non dans le corps de la
fonction ?


A indiquer que la fonction peut lever une exception de type
std::bad_alloc si elle échoue


Par ailleurs, elles ne pourront faire remonter QUE des exceptions des
types indiqués.

Par exemple, si on veut empecher une fonction quelconque de faire
remonter une exception, on peut rajouter à sa signature (et tout à la
fin, après le qualificatif const) :
throw (void)

C'est ce que fait delete dans l'exemple ci-dessus, ce qui est tout à
fait normal car delete ne doit _jamais_ renvoyer d'exception. A moins de
changer le handler de new (set_new_handler), new renvoie
systématiquement std::bad_alloc quand il ne peut effectuer une
allocation (et donc, pas un pointeur nul).


--
Magnet