J'ai une question concernant la désallocation de mémoire et les exceptions. lorsque j'utilise delete pour supprimer un objet créé sur le tas. Si une exception se produit avant que cette suppression soit la fuite de mémoire ou cette suppression va s'exécuter?Désallocation de mémoire et exceptions
Répondre
Cela dépend de l'emplacement de delete
. Si c'est à l'intérieur du catch
qui attrape l'exception, il peut invoquer.
try {
f(); // throws
} catch(...) {
delete p; // will delete
}
Si c'est après la catch
qui attire l'exception et que catch
ne revient pas de la fonction (à savoir permet le flux d'exécution de procéder après le bloc catch
), le delete
pourrait être appelé.
try {
f(); // throws
} catch(...) {
// execution proceeds beyond catch
}
delete p; // will delete
Si le delete
n'est pas dans un bloc catch
ou après un bloc catch
qui permet l'exécution de procéder alors delete
ne sera pas appeler.
try {
f(); // throws
delete p; // will not delete
} // ...
Comme vous pouvez l'imaginer, dans les deux premiers cas, au-dessus du delete
ne sera pas invoquée s'il y a un jet avant la delete
:
try {
f(); // throws
} catch(...) {
g(); // throws
delete p; // will not delete
}
Notez que les exceptions sont bonnes parce que vous n'avez pas à les attraper dans chaque fonctionner dans la pile d'appels. Ils peuvent être combattus à un niveau "extérieur". Comment libérez-vous la mémoire allouée dans les fonctions internes? Comme par exemple si la fonction f() lève une mémoire allouée d'exception. Serait-ce une bonne idée d'attraper l'exception dans f() et la mémoire libre, puis de le relancer au niveau suivant dans la pile d'appels? – NickSoft
Il ne sera pas appelé. C'est pourquoi vous êtes encouragé à regarder RAII. Voir Stroustrup
Dans le cas que vous décrivez, la mémoire va fuir.
Deux astuces pour éviter ce problème:
utiliser des pointeurs intelligents qui ne souffrent pas du même problème (solution préférée)
-> le pointeur intelligent dans construit sur la pile, son destructor est donc appelé, peu importe quoi, et la suppression du contenu pointu est fourni dans le destructorles instructions utilisent try/catch, et supprimer l'élément dans la déclaration de capture et
Nous devons aussi faire en sorte que « exception » signifie vraiment une exception C++ qui peut être capturée par try/catch. Il existe également d'autres exceptions dans le système que C++ try/catch ne peut pas détecter (par exemple, division par 0).
Dans de tels cas (au-delà de la portée des normes C++), "delete" ne sera pas exécuté non plus, sauf si ces exceptions sont interceptées et que le gestionnaire appelle explicitement "delete" de manière appropriée.
- 1. Mécanisme d'allocation et de désallocation de mémoire en pile
- 2. CUDA problèmes mondiaux de désallocation de mémoire dans .NET
- 3. Cocoa Touch - Désallocation IBOutlets
- 4. Numéro de désallocation NSMUtableDictionary
- 5. Java utilise toujours la mémoire système après désallocation des objets et récupération de place
- 6. Intel MKL gestion de la mémoire et des exceptions
- 7. Gestion de la mémoire et gestion des exceptions
- 8. Comment tester les exceptions de mémoire insuffisante?
- 9. Est-il possible de suivre l'allocation/désallocation?
- 10. Désallocation correcte d'une vue
- 11. objets Désallocation NSMutableArray
- 12. héritage Désallocation, C++
- 13. Problème de désallocation de mémoire de l'iphone avec scrollview avec image à l'intérieur
- 14. désallocation d'objet avant audioPlayerDidFinishPlaying callback
- 15. Segfault pendant la désallocation du tableau C++
- 16. allocation dynamique/désallocation des tableaux 2D et 3D
- 17. débordement de pile en raison de l'allocation tas/désallocation
- 18. Présentation des exceptions .NET GC et OutOfMemory
- 19. Interception et exceptions de l'unité
- 20. Exceptions et IDispatchMessageInspector
- 21. Exceptions, Global.asax et eventlog
- 22. Exceptions et scriptablemember
- 23. Task.WaitAll et exceptions
- 24. Déclencheurs et exceptions PostgreSQL
- 25. stl et exceptions
- 26. Affectations et exceptions
- 27. Exceptions et annulation
- 28. Les délégués et les fuites de mémoire dans l'iPhone?
- 29. Analyse de la mémoire C++
- 30. Ordre de commande C++ de la désallocation des membres statiques
Vous voulez dire avant, pas pendant? Eh bien, il est évident que si le 'delete' ne sera pas appelé (parce que l'exception est levée avant) alors aucune mémoire n'est libérée. Si vous demandez une exception pendant la destruction, alors http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.3 – adf88