jeter des exceptions d’objects sur la stack, mem fuite avec nouveau?

Est-ce un bug de faire ceci:

if(some_error) throw Cat("Minoo"); 

Où Cat est une classe.

Puis dans une autre fonction qui appelle la méthode qui lève l’exception

J’aurais:

 catch(const Cat &c) { } 

S’il n’est pas valide, est-ce que j’utilise new Cat (“Minoo”);

Cela causerait-il une fuite de mémoire?

1) invalide? Non, c’est précisément ce que vous êtes censé faire: lancer un object. L’object dans l’instruction-throw peut être sur la stack, mais il est copié quand il est lancé. Comparez, par exemple, l’effet de l’exécution de return Cat (“Minoo”);

2) Le fait de lancer un pointeur causera-t-il une fuite de l’object pointé? Oui, si l’object a été alloué sur le tas et à moins que vous ne décidiez de le supprimer. Mais vous devriez éviter de jeter des pointeurs en règle générale.

Ce que vous avez maintenant, c’est ce que tout le monde devrait faire, et la plupart le font. Lance l’object lui-même et attrape par const-reference.

Lancer des pointeurs a des problèmes velus tels que “qui le supprime?”.

Plus d’informations ici .

Ce que vous avez écrit est parfaitement valide et est généralement préférable à l’allocation d’objects d’exception sur le tas.

Si vous utilisiez new, vous obtiendrez bien entendu une fuite de mémoire, sauf si vous supprimez l’object dans un gestionnaire d’exceptions qui a intercepté l’exception.

Cette question dans la FAQ C ++ (et les deux questions suivantes) aborde cette question.