Discussion:Programmation C-C++/Les exceptions/Exceptions dans les constructeurs

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche

Bonjour, je ne comprends pas les paragraphes suivants :

"De même, lorsque la construction de l'objet se fait dans le cadre d'une allocation dynamique de mémoire, le compilateur appelle automatiquement l'opérateur delete afin de restituer la mémoire allouée pour cet objet. Il est donc inutile de restituer la mémoire de l'objet alloué dans le traitement de l'exception qui suit la création dynamique de l'objet, et il ne faut pas y appeler l'opérateur delete manuellement.

Comme il l'a été dit plus haut, le compilateur n'appelle pas le destructeur pour les objets dont le constructeur a généré une exception. Cette règle est valide même dans le cas des objets alloués dynamiquement. Le comportement de l'opérateur delete est donc lui aussi légèrement modifié par le fait que l'exception s'est produite dans un constructeur."

Je suis certain que le destructeur n'est pas appelé dans le cas d'une exception dans le constructeur. C'est donc le premier paragraphe que je ne saisi pas. C'est sans doute trivial, mais je ne vois pas la différence. Pouvez vous m'aider? Merci

86.199.240.95 10 novembre 2008 à 10:51 (CET)Jacques

Bonjour,
Je vais essayer d'éclaircir ce point ici, puis modifier la page afin que cela soit plus clair:
Il faut distinguer les deux opérations effectuées par l'opérateur delete:
  1. L'appel au destructeur,
  2. Puis la libération de la zone mémoire allouée.
Lorqu'on alloue un objet dynamiquement, il y a deux opérations effectuées par l'opérateur new:
  1. Allocation mémoire,
  2. Appel au constructeur demandé.
Si le premier point échoue (pas de place mémoire), il n'y a rien à libérer, inutile d'appeler delete.
Si le deuxième point échoue (exception dans le constructeur), la zone mémoire est libérée de façon automatique, inutile d'appeler delete.
Si les deux opérations réussissent, l'objet a été alloué, et devra être libéré en appelant l'opérateur delete.
--DavidL 10 novembre 2008 à 12:08 (CET)