Est-il une raison pour appeler delete en C++ lorsqu'un programme est de sortir de toute façon?
Dans mon C++ main
fonction, par exemple, si j'avais un pointeur vers une variable qui utilise la mémoire du tas (par opposition à la mémoire de pile) - est-ce automatiquement libéré après mon application se ferme? Je suppose que oui.
Même ainsi, il est de bonne pratique de toujours supprimer les allocations de tas, même si vous pensez qu'ils ne seront jamais utilisés dans une situation où la mémoire est automatiquement libéré à la sortie?
Par exemple, quel est l'intérêt de faire cela?
int main(...)
{
A* a = new A();
a->DoSomething();
delete a;
return 0;
}
Je pensais peut-être dans le cas où je refactoriser (ou quelqu'un d'autre refactors) que le code et le met ailleurs dans la demande, où delete
est vraiment neccecary.
Ainsi que la réponse de Brian R. Bondy (qui parle spécifiquement sur les implications en C++), Paul Tomblin a aussi un la bonne réponse à une question spécifique C, qui parle aussi le destructeur C++.
- Le duplicata est mentionné sur le C, qui passe à côté de certaines informations importantes sur le destructeur qui est un problème en C++.
- ma réponse à la double mentionne également les destructeurs (maintenant). J'ai le sentiment que celui-ci devrait être supprimé est toujours debout.
- Pas sûr de ce que tu veux dire à propos de destructeur - veuillez préciser.
- Fondamentalement, la question a une réponse différente pour le C et le C++. En C++, vous devez aussi considérer qu'il y a encore plus de raison de le supprimer de votre mémoire, dans votre programme, car si vous n'avez pas votre destructeur de votre classe ne sera pas appelé. Qui peuvent contenir de très important code.
- Ah, bon point. Je pense que ma question a également fait le point de "devrais-je supprimer de toute façon, de bonnes pratiques?" - pas seulement "devrais-je supprimer lors de la sortie?".
- Tomblin: Mais la question, c'est la seule taggés avec, et ne demande qu'à propos de C. Donc votre réponse je pense, est plus adapté ici. Si l'autre question posée sur le C/C++ alors je dirais que votre réponse doit être accepté là-bas si.
- Ok, vous m'avez convaincu. Mais j'aime toujours ma réponse à cette autre question mieux.
A a = new A();
est pas valide en C++.
Vous devez vous connecter pour publier un commentaire.
Il est important d'appeler explicitement supprimer, car vous pourriez avoir un peu de code dans le destructeur que vous souhaitez exécuter. Comme peut-être l'écriture de données dans un fichier journal. Si vous laissez le système d'exploitation libre de votre mémoire pour vous, votre code dans votre destructeur ne sera pas exécuté.
La plupart des systèmes d'exploitation désallouer de la mémoire lors de la fin de votre programme. Mais il est de bonne pratique pour désallouer vous-même et comme je l'ai dit ci-dessus le système d'exploitation ne pas appeler votre destructeur.
Comme pour l'appel de supprimer en général, oui, vous voulez toujours appeler delete, ou vous risquez d'avoir une fuite de mémoire dans votre programme, ce qui conduira à de nouvelles attributions de l'échec.
delete
. Dois-je toujours besoin d'appeler explicitement les supprimer? ou compter sur les OS pour faire pour moi?Oui, il aide à éliminer les faux positifs lorsque vous exécutez votre programme grâce à un outil de détection de fuite de mémoire.
Oui.
Considérons le cas où la suppression de l'objet acquis une ressource externe qui ne peuvent pas être libérés en toute sécurité par le système d'exploitation. Si vous n'appelez pas supprimer sur cet objet, vous avez une réelle fuite.
Pensez à votre classe
A
avoir à détruire.Si vous n'appelez pas
delete
sura
, que le destructeur ne sera pas appelée. Généralement, cela n'a pas vraiment d'importance si le processus se termine de toute façon. Mais que faire si le destructeur de a à libérer les objets, par exemple dans une base de données? Vider les cache dans un fichier de log? Écrire un mémoire cache sur le disque?Vous voyez, ce n'est pas seulement une "bonne pratique" pour supprimer des objets, dans certaines situations, il est nécessaire.
Une autre raison pour explicitement la suppression d'objets, c'est que si votre application dispose d'une véritable fuite de mémoire, il devient plus facile d'utiliser des outils comme valgrind pour trouver les fuites si vous n'avez pas à passer au crible les "fuites" qui viennent de ne pas prendre la peine de nettoyer.
Une autre raison de supprimer est pour éviter les fausses alarmes à partir d'un détecteur de fuite, vous pouvez utiliser à l'avenir. Si vous avez des fausses alarmes vous ne pouvez pas payer attention à une véritable fuite signalée par un détecteur de fuite il sera enterré parmi les faux dans le rapport.
assurez-vous toujours que vous supprimez vous-même. Un OS pour prendre soin de cela, mais d'exclure les bugs qui peuvent facilement être évités