0
votes

Raii et les membres si le constructeur jette?

J'ai déjà travaillé dans un paramètre où des exceptions ont été désactivées et l'échec de la mémoire de la mémoire signifie que nous tuerons le programme. Travailler maintenant avec des exceptions, je m'interroge sur la sémantique précise des éléments suivants: xxx

ma question est ce qui se passe lorsque nouvelle bar lève lorsque y est alloué? Je suppose que le destructeur de x est appelé de sorte que la première allocation est nettoyée. Comment la langue garantit-elle cela? Tout le monde connaît une citation de la norme qui explique la sémantique précise?


1 commentaires

y n'est pas "alloué" en soi ; Son espace mémoire fait partie de celui du FOO . La chose qu'elle pointe est allouée par votre nouvelle barre expression. Faites attention à la terminologie. Je pense que vous vouliez dire "initialisé".


3 Réponses :


0
votes

Si une exception est lancée lors de la construction d'objets, l'objet était pas construit et que vous ne devriez pas faire aucune hypothèse sur l'état de tout membres. L'objet n'est tout simplement pas utilisable. Tous les membres initialisés avant l'exception étant lancés seront destructés dans l'ordre inverse de leur construction.

https://eel.is/c++Draft/basic .Life # def: la vie décrit les règles de vie.


0 commentaires

4
votes

Oui, tous les membres complètement construits seront détruits. Votre objet ne sera laissé dans aucune sorte d'état «à moitié vivant». Aucune fuite de mémoire ne se produira.

[sauf.ctor] / 3 : Si l'initialisation ou la destruction d'un objet autre que par délégation constructeur est terminée par une exception, le destructeur est invoqué pour chacun des sous-coordonnements directs de l'objet et, pour un objet complet, des sous-observations de classe de base virtuelle, dont l'initialisation est terminée ( [DCL.Init]) [..] Les sous-observations sont détruites dans l'ordre inverse de l'achèvement de leur construction. [..]

Nous pouvons le démontrer nous-mêmes: xxx

( Démo en direct )

C'est, en fait, l'un des principaux avantages des "pointeurs intelligents": la sécurité des exceptions. Était x un pointeur brut, vous auriez fui la chose qu'il pointe, car une destruction d'un pointeur cru ne fait rien. Avec une sécurité d'exception, vous pouvez avoir RAII; sans elle, bonne chance.


1 commentaires

En outre, l'ordre de construction est l'ordre de la déclaration des membres et strictement séquencé, de sorte que les membres qui auraient appelé leurs destructeurs sont tous ceux déclarés devant celui dont l'initialisateur correspondant se jette.



3
votes

Si vous êtes inquiet pour les deux Nouvelle barre Les expressions entrelaciants et jetant avant que les poignées ne soient initialisées pour contenir ce qu'elles sont signifiées, la norme ne le permet pas.

premier dans [intro.execution]

12 une expression complète est

  • Un déclarateur init ou un initialiseur de Mem, y compris les expressions constitutives de l'initialisateur,

    16 Tout calcul de valeur et effet secondaire associé à une L'expression complète est séquencée avant chaque calcul de la valeur et le côté effet associé à la prochaine expression complète à évaluer.

    sans trop d'aller dans les détails, x {nouveau bar} et y {nouveau bar} dans leur intégralité sont tous deux considérés comme étant considérés comme étant une "expression complète" (Même s'ils ne sont pas des expressions grammaires sage). Les deux paragraphes que j'ai cités indiquent que l'intégralité de l'initialisation de x (qui inclut nouvelle bar ) doit se produire d'abord, ou l'intégralité de l'initialisation de y doit arriver en premier. Nous savons de [classe.base.init]

    13.3 - alors, non Les membres de données statiques sont initialisés dans l'ordre dans lequel elles ont été déclarées dans la définition de la classe (à nouveau indépendamment de la commande. des initialiseurs de mémoire).

    SO x est initialisé en totalité, puis y . Donc, même si nouvelle barre lors de l'initialisation y , x possède déjà la ressource qu'il est destiné à tenir. Dans ce cas, lorsque l'exception est lancée, le verbiage dans [sauf.ctor] Paringh 3 s'appliquera au x entièrement construit, et il sera détruit, libérant ainsi la ressource.


0 commentaires