Quand l'appel manuel d'un destructeur est-il justifié ?
L'idée selon laquelle l'appel manuel d'un destructeur indique une conception défectueuse est souvent affirmée. Cependant, cela soulève la question : existe-t-il des exceptions à cette règle ?
Contre-exemples : cas nécessitant des appels manuels au destructeur
En effet, il existe des situations où cela devient nécessaire pour invoquer explicitement le destructeur :
1. Désallocation de mémoire contrôlée :
Lorsque l'allocation et la désallocation de mémoire sont gérées indépendamment de la construction et de la destruction d'objets, les appels manuels au destructeur deviennent cruciaux. Dans de tels cas, la construction d'objets se produit via le placement d'un nouveau tampon de mémoire existant, tandis que la destruction se produit via un appel explicite au destructeur.
char buffer[sizeof(MyClass)]; { MyClass* p = new(buffer)MyClass; p->dosomething(); p->~MyClass(); }
2. Allocateurs de mémoire spécifiques :
Un autre exemple est l'utilisation par std::vector du std::allocator par défaut. Ici, les éléments sont construits lors des opérations push_back, mais l'allocation de mémoire se produit par morceaux antérieurs à la construction de l'élément. En tant que tel, vector::erase doit détruire les éléments sans nécessairement désallouer la mémoire, en particulier si d'autres push_backs sont imminents.
Implications :
L'appel manuel des destructeurs peut violer les règles strictes Principes de la POO en brouillant les frontières entre la gestion des objets et la gestion de la mémoire. Cependant, dans la programmation de bas niveau ou dans les scénarios où l'allocation et la désallocation de mémoire sont découplées, cela peut être approprié. considérée comme une bonne pratique.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3