J’ai deux classes, base_class et Derive_class et le code suivant:
base_class *ptr = new derived_class; delete ptr;
Ce code produira-t-il une fuite de mémoire? Si oui, comment devrais-je m’en occuper?
L’object que vous supprimez ne fuira pas, son bloc de mémoire sera libéré.
Si vous n’avez pas déclaré le destructeur de base_class
virtuel, des objects dynamicment alloués contenus dans la derived_class
s’appuieront sur le destructeur de la derived_class
appelé pour les libérer. En effet, si le destructeur n’est pas virtuel, le destructeur derived_class
la derived_class
n’est pas appelé dans ce cas. Cela signifie également que les destructeurs des “objects incorporés” au sein de la derived_class
ne seront pas automatiquement appelés, un problème distinct mais supplémentaire pouvant entraîner des fuites supplémentaires et la non-exécution d’un code de nettoyage essentiel.
En bref, déclarez que le destructeur de base_class
est virtuel et vous pouvez utiliser en toute sécurité la technique que vous avez présentée.
Pour un exemple codé, voir:
Dans quel genre de situation, c ++ destructor ne sera pas appelé?