6
votes

Dépassement de la mémoire et exceptions

J'ai une question concernant la répartition de la mémoire et des exceptions. Lorsque j'utilise Supprimer pour supprimer un objet créé sur le tas. Si une exception survient avant que cette suppression est la mémoire de la fuite ou que cette suppression sera exécutée?


1 commentaires

Vous voulez dire auparavant, pas pendant? Eh bien, cela est évident que si le Supprimer ne sera pas appelé (car une exception est lancée avant), aucune mémoire n'est libérée. Si vous demandez une exception lors de la destruction, alors Parasht.com/ C ++ - FAQ-Lite / Exceptions.HTML # FAQ-17.3


4 Réponses :


2
votes

Ce ne sera pas appelé. C'est pourquoi vous êtes encouragé à regarder Raii. Voir STROSTRUP


0 commentaires

5
votes

Dans le cas que vous décrivez, la mémoire va fuir.

Deux astuces pour éviter ce problème:

  • Utilisez des pointeurs intelligents, qui ne souffrent pas du même problème (solution préférée)
    -> Le pointeur intelligent de construction sur la pile, son destructeur est donc appelé, quoi que ce soit et la suppression du contenu pointue est fournie dans le destructeur

  • Utilisez des instructions try / attraper et supprimez l'élément dans la déclaration de capture, ainsi que


0 commentaires

4
votes

Cela dépend de l'endroit où ce Supprimer code> est. Si c'est à l'intérieur du attrape code> qui attire l'exception, cela pourrait invoquer.

try {
    f();  // throws
} catch( ... ) {
    g();  // throws
    delete p;  // will not delete
}


1 commentaires

Notez que les exceptions sont bonnes car vous n'avez pas à les attraper dans chaque fonction de la pile d'appels. Ils peuvent être soumis à un niveau "extérieur". Comment libérez-vous la mémoire allouée dans les fonctions intérieures? Comme par exemple, si la fonction F () qui jette une mémoire attribuée d'exception. Serait-ce une bonne idée d'attraper l'exception dans F () et de la mémoire libre, puis de la jeter au niveau suivant dans la pile d'appels?



0
votes

Nous devons également veiller à ce que la "exception" signifie vraiment une exception C ++ qui peut être attrapée par essayer / attraper. Il existe également d'autres exceptions sur le système que c ++ essayer / attraper ne peut pas attraper (par exemple la division 0).

Dans de tels cas (au-delà de la portée des normes C ++), "Supprimer" ne sera pas exécutée à moins que ces exceptions soient capturées et que le gestionnaire invoque explicitement "Supprimer" de manière appropriée.


0 commentaires