De gestion de mémoire, de Corruption de tas, et de c++

Donc, j'ai besoin d'aide. Je suis en train de travailler sur un projet en C++. Cependant, je pense que j'ai réussi à corrompre mon tas. Ceci est basé sur le fait que j'ai ajouté un std::string pour une classe et l'affectation d'une valeur à partir d'un autre std::string:

std::string hello = "Hello, world.n";
/* exampleString = "Hello, world.n" would work fine. */
exampleString = hello;

écrase sur mon système avec un vidage de pile. Donc en gros, j'ai besoin de arrêt et passer en revue tous mes trucs de gestion du code et de la mémoire et découvrir où j'ai merdé. Le codebase est encore petit (environ 1000 lignes), donc c'est facilement faisable.

pourtant, je suis dépassé par ce genre de choses, alors j'ai pensé que j'allais le jeter là-bas. Je suis sur un système Linux et j'ai fouillé partout avec valgrind, et bien que ne sachant pas tout à fait ce que je fais, il a signalé que le était un free invalide. Je dois admettre que je reçois le terme 'corruption tas' d'une recherche Google; Tous les articles à usage général sur ce genre de choses serait apprécié aussi bien.

avant rm -rf ProjectDir, faire à nouveau in C#: D)

modifier: Je ne l'ai pas dit clairement, mais ce que je demande, ce sont des conseils pour diagnostiquer ce genre de problèmes de mémoire. Je sais que le truc std::string est correct, donc c'est quelque chose que j'ai fait (ou un bug, mais il n'y a pas de problème avec Select). Je suis sûr que je pourrais vérifier le code que j'ai écrit et vous les gens très intelligents verraient le problème en un rien de temps, mais je veux ajouter ce genre d'analyse de code à ma "boîte à outils", comme il étaient.

16
demandé sur sameera lakshitha 2008-08-11 08:52:50

12 réponses

ce sont des mécanismes relativement bon marché pour éventuellement résoudre le problème:

  1. Gardez un oeil sur mon tas question de corruption - je mets à jour les réponses au fur et à mesure qu'elles sortent. Le premier était l'équilibre new[] et delete[], mais vous le faites déjà.
  2. Donner valgrind plus d'un aller; c'est un excellent outil, et je souhaite seulement qu'il soit disponible sous Windows. Je ne ralentis votre programme que de moitié, ce qui est assez bien. comparé aux équivalents Windows.
  3. Pensez à utiliser le Google Outils De Performance en remplacement de malloc/new.
  4. avez-vous nettoyé tous vos fichiers d'objets et recommencé? Peut-être que votre fichier est... "sous-optimale"
  5. Vous n'êtes pas assert()ing assez dans votre code. Comment puis-je savoir que sans l'avoir vu? Comme le fil dentaire, personne n' assert()s assez dans leur code. Ajouter une fonction de validation pour vos objets et l'appeler sur méthode de début et de fin de la méthode.
  6. vous compilation de mur