C.31: Toutes les ressources acquises par une classe doivent être libérés par le destructor de la classe
Toutes les demandes de ressources doivent libérer destructor
Raison (raison)
Prévention des fuites de ressources, en particulier dans les cas d'erreur.
Éviter les fuites de ressources, en particulier en cas d'erreur.
Note (Note)
Pour les ressources représentées comme des classes avec un ensemble complet d'opérations par défaut, cela se produit automatiquement.
Si la performance des ressources pour la réalisation de l'ensemble de l'action par défaut des classes, ce qui se passera automatiquement.
Exemple (Exemple)
class X {
ifstream f; // may own a file
// ... no default operations defined or =deleted ...
};
La ifstream de X ferme implicitement un fichier, il peut avoir ouvert sur la destruction de son X.
par les membres de la classe X ifstream destructor implicitement tout près d'ouvrir tout document qu'il.
Exemple, mauvais (échantillon négatif)
class X2 { // bad
FILE* f; // may own a file
// ... no default operations defined or =deleted ...
};
X2 peut fuir un descripteur de fichier.
La possibilité de descripteurs de fichiers de fuites existent X2. (Plus précisément généralement disparu près du fichier, Note du traducteur)
Note (Note)
Qu'en est-il un sockets qui ne se ferme pas? A destructor, à proximité, ou opération de nettoyage ne doit jamais échouer. Si elle le fait quand même, nous avons un problème qui n'a pas vraiment bonne solution. Pour commencer, l'auteur d'un destructor ne sait pas pourquoi le destructor est appelé et ne peut « refuser d'agir » en lançant une exception. Voir la discussion. Pour aggraver le problème, beaucoup ne sont pas réessayable opérations « à proximité / release ». Beaucoup ont essayé de résoudre ce problème, mais il est connu aucune solution générale. Si possible, pensez à défaut de fermeture / nettoyage une erreur de conception fondamentale et de mettre fin.
sokcet (communication, note du traducteur) n'a pas été arrêté ce qui se passe? Tout d'abord, destructor, arrêt ou opération d'effacement ne doit jamais manquer. Si elle ne manque, ce problème est pas vraiment une bonne solution. Pour (communication, note du traducteur) module de tête, l'auteur ne sait pas destructor destructor en raison de ce qu'on appelle, et il n'y a aucun moyen en lançant une exception « a refusé de traiter. » Voir la discussion (https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Sd-never-fail). Plus sérieusement, beaucoup ne peuvent pas être rejugé opération « close / release ». Pour résoudre ce problème, il y a eu de nombreuses tentatives, non sans trouver des solutions communes. Si possible, désactivez ou supprimer l'échec considéré comme une erreur fondamentale et se termine.
Note (Note)
Une classe peut contenir des pointeurs et des références à des objets qui ne lui appartient pas. De toute évidence, ces objets ne doivent pas être supprimés par le destructor de la classe. Par exemple:
Classe peut contenir un pointeur vers un objet qu'il n'a pas la propriété, ou de référence. De toute évidence, un tel objet ne doit pas être détruit destructor de classe. Par exemple:
Preprocessor pp { /* ... */ };
Parser p { pp, /* ... */ };
Type_checker tc { p, /* ... */ };
Ici, p fait référence aux pages mais ne possède pas.
Lorsque les points p à p mais ne possède pas p.
Application (Suggestions)
-
(Simple) Si une classe a pointeur ou les variables membres de référence qui sont propriétaires (par exemple, les propriétaires réputés en utilisant GSL :: propriétaire), alors ils devraient être référencé dans son destructor.
(Simple) Si la classe contient un propriétaire (par exemple, en déclarant la propriété GSL :: propriétaire) membre de pointeur ou de référence, alors ils devraient être référencés dans le destructor.
Note du traducteur: pense personnellement qu'il devrait être libéré dans le destructor.
-
(Difficile) Déterminer si les variables membres du pointeur ou de référence sont propriétaires quand il n'y a pas de déclaration explicite de la propriété (par exemple, regardez les constructeurs).
-
(Difficile) pour déterminer quand le pointeur ou référence des variables membres de type ne sont pas explicitement indiqué si la propriété qui est le propriétaire (par exemple, par walk-constructeurs, etc.).
Lien original:
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c31-all-resources-acquired-by-a-class-must-be-released-by-the-classs-destructor
Je pense que cet article utile? Bienvenue pouces et partager avec plus de gens.
Lire la suite des articles mis à jour, s'il vous plaît attention à numéro public micro-canal de la pensée orientée objet []