C++ gestion de la mémoire et des vecteurs
Je suis très confondre avec la gestion de la mémoire par rapport aux vecteurs et pourrait faire avec quelques concepts de base de l'expliquer.
J'ai un programme qui utilise de gros vecteurs.
J'ai créé les vecteurs avec la nouveau de l'opérateur et de les libérer à la fin du programme avec supprimer pour obtenir le secours de la mémoire.
Ma question est, si le programme se bloque ou est annulée pour n'importe quelle raison, le supprimer lignes sera raté, est-il un moyen de récupérer de la mémoire même dans ce scénario.
J'ai aussi quelques autres grands vecteurs que j'attribue sans nouveau mot-clé.
J'ai lu que ces sera créé sur le tas, mais n'ont pas besoin d'être libéré de toute façon que la gestion de la mémoire est traitée avec "sous le capot".
Cependant, je ne suis pas sûr que c'est le cas, comme à chaque fois que je lance mon programme, je perds la mémoire RAM.
Donc ma deuxième question est, peut vecteurs créé sans l' nouveau mot-clé vraiment être laissés à leur propre sort et de confiance pour nettoyer après eux-mêmes, même si le code est abandonnée milieu.
Et je suppose qu'une troisième question qui a surgi à l'esprit est que, si les Vecteurs sont automatiquement créé sur le tas pourquoi voudriez-vous utiliser les nouveau mot-clé avec eux?
Merci pour la lecture,
ben
- Par "chaque fois que je lance mon programme, je perds la mémoire RAM" voulez-vous dire "ma RAM disponible diminue, jusqu'à ce que je quitter le programme" ou "ma RAM disponible est petite, même après que j'ai quitter le programme, et il devient encore plus la prochaine fois que je lance, jusqu'à ce qu'un jour je vais avoir absolument aucune RAM de gauche"?
- Je suis détachement Max de question. Windows, je crois, ne fait pas les décharger résilié programmes, sauf si il en a besoin. De cette façon, ils démarrent plus rapidement après la première fois.
- "Et je suppose qu'une troisième question qui a surgi à l'esprit est que, si les Vecteurs sont automatiquement créé sur le tas pourquoi voudriez-vous jamais utiliser le mot clé new avec eux?" Vous n'aurez besoin de faire cela si vous avez besoin de passer d'un vecteur en un point hors de la portée actuelle. Ceci est relativement rare dans la pratique.
Vous devez vous connecter pour publier un commentaire.
Je soupçonne que vos questions sont sur le std::vector< T > (par opposition à un tableau T[]).
Ne pas utiliser
new
pour créer des vecteurs. Il suffit de les placer sur la pile.Le vecteur du destructeur appelle automatiquement le destructeur de chaque élément du vecteur. Si vous n'avez pas à vous soucier de la suppression d'objets vous-même. Toutefois, si vous avez un vecteur de pointeurs, les objets que les pointeurs font référence à la volonté de pas être nettoyé. Voici un exemple de code. Pour plus de clarté, je suis en laissant plus de détails:
Même si main() lève une exception, pas de perte de la mémoire. Toutefois, ce code ne fuite de mémoire:
Oui, vous pouvez faire confiance à vecteurs de nettoyer après eux-mêmes.
CEPENDANT Vous ne pouvez pas faire confiance à la trucs vecteur détient pour le nettoyage après lui-même. Ce qui doit être nettoyé pourrait être quelque chose qui persiste en dehors de votre application. Si sa mémoire, ce n'est pas un souci. Si son assurez vous que les balises XML sont toutes fermées, alors le système d'exploitation n'est pas en mesure de vous aider.
Par exemple, si vous avez un vecteur de certaines déglingués de verrouillage de l'objet comme ceci:
Comment votre vecteur d'Horloge savoir pour débloquer tout quand c'est fait? Du vecteur ne sont pas construits à savoir sur les verrous.
C'est essentiellement la même situation que d'avoir un vecteur de pointeurs:
Comment le vecteur de savoir qui pointeurs ici ont été supprimés et NULL souhaitez, et ceux qui sont vraiment là? Peut-être que certains ont été supprimés et mis à votre valeur spéciale 0xdeadbeef, sens supprimé.
Le point est le vecteur n'a aucun moyen de savoir ce ou de savoir que ses éléments sont des pointeurs ou des serrures ou de quoi que ce soit. Ils ont juste besoin d'être des choses qui ont des constructeurs par défaut et sont copiable, et répondre aux autres exigences que le vecteur a sur ses éléments.
La solution est de faire en sorte que, quel que soit le vecteur DÉTIENT doit être responsable de son nettoyage. Ceci est appelé RAII -- l'Allocation des Ressources Est l'Initialisation, le plus important ici, les Ressources de la Destruction est la Désallocation. Avec Notre Horloge exemple ci-dessus, la réponse est évidente, assurez-vous de déverrouiller lorsque nous y sommes!
Mais avec des pointeurs il n'est pas si évident. La solution consiste à envelopper le pointeur dans un smart_ptr classe. Le plus prolifique de ces sont les boost de la famille des smart poniters.
Des fonctionnalités supplémentaires sont mis en jeu avec des pointeurs telles que le comptage de référence, mais l'exemple ci-dessus devrait vous donner l'essentiel de la nature du problème et la façon dont son généralement résolu.
De la mémoire créée par votre programme sera libéré quand il sort. C'est une fonctionnalité du Système d'Exploitation, rien à voir avec le langage de programmation que vous utilisez.
"chaque fois que je lance mon programme, je lâche RAM" doit être dû à un autre effet - comment mesurez-vous que?
Pourquoi vous devriez utiliser "nouveaux" - deux raisons:
Je suppose que vous parlez du std::vector, et non la langue des tableaux.
L'un de nous deux est un peu confus ici.
Si vous êtes en utilisant std::vector, vous n'avez pas besoin d'manuellement allouer de la mémoire pour l'un de ses éléments. De l'espace supplémentaire sera automatiquement être attribués lors nécessaire à chaque fois que vous faites un push_back(). Si vous avez besoin de tout l'espace préaffectés pour une raison quelconque, vous pouvez appeler (réserve). De toute façon, la mémoire libérée automatiquement pour vous lorsque le vecteur est détruite.
Si vous faites de nouvelles std::vector, vous obtenez un pointeur vers le vecteur. Qui n'est pas différent que de l'appeler à nouveau dans une autre catégorie. Vous créer un pointeur vers un objet de cette classe, et elle sera détruite lorsque vous appelez supprimer. Si vous n'aimez pas ce comportement, essayez de créer votre vecteur sur la pile.
Pour la "perte de mémoire", ce que @RichieHindie dit.
Pour la deuxième question:
Alors que la normale de fin de programme (y compris la résiliation par exception) veille à ce que les destructeurs execute (avec quelques arguties concernant les données statiques -- en théorie, ceux-ci devraient également, dans la pratique, vous pouvez parfois obtenir des problèmes), suffisamment dur blocage du processus ne peut garantir un comportement, par exemple, un
kill -9
est garanti de mettre fin à votre programme le plus tôt possible, sans lui donner la chance à signer tous les destructeurs ou quoi que ce soit d'autre.Un autre scénario ne sont pas mentionnés en ce qui concerne quand vous voulez les utiliser "nouveaux", est, dans certains cas, un vecteur est une variable membre d'une classe. La valeur NULL peut être utilisé comme un supplément de sémaphore, par exemple au cours de création sur demande; aussi, si le vecteur d'utilisation est peu peuplée sur votre classe, puis pas même la création d'un sauf si c'est vraiment nécessaire, vous fera économiser de la mémoire, à la charge de l'extra 4 octets de pénalité sur toutes les instances ainsi que l'exécution de la pénalité de le pointeur d'indirection.