problème avec les conteneurs: *** *** glibc détecté libre (): pointeur invalide: 0x41e0ce94 ***

StackOverflow https://stackoverflow.com/questions/751940

  •  09-09-2019
  •  | 
  •  

Question

J'ai un programme C ++ sur Linux qui se bloque après un certain temps avec le message:

*** glibc detected *** free(): invalid pointer: 0x41e0ce94 ***

A l'intérieur du programme Je utilise largement des conteneurs. Ils doivent stocker des objets d'une classe simple.

EDIT 17/04/2009:

En attendant, il semble clair que l'erreur n'a rien à voir avec la classe simple. L'erreur se produit encore si je change les conteneurs pour contenir d'autres types de données. Le problème doit être quelque part ailleurs dans mon code, je suis en train de le comprendre au moment ...

Était-ce utile?

La solution

Pensez à utiliser un std :: string pour maintenir la valeur de chaîne au lieu d'un pointeur char brut. Ensuite, vous ne serez pas à vous soucier de la gestion des données de chaîne dans votre tâche, copie, et les méthodes de destruction. Très probablement votre problème est là.

Edit: Il n'y a pas problème avec la nouvelle classe que vous avez publié, et aucun problème avec la première version si vous utilisez uniquement le char * pour pointer vers les constantes de chaîne. Le problème se trouve ailleurs dans le programme ou de la façon dont vous utilisez la classe. Vous devrez passer plus de temps à creuser dans le débogueur et / ou valgrind pour traquer le problème. Je comprendre ce qui est pointé à l'adresse indiquée et essayer de déterminer pourquoi il est libéré deux fois.

Autres conseils

Lors d'une estimation, il y a quelque chose qui cloche dans votre copie cteur, op d'affectation ou destructor -. Vous devez montrer le code pour les

Modifier Juste remarqué que vous ne disposez pas d'un opérateur d'affectation - en supposant que votre constructeur de copie et destructor sont OK, vous avez besoin d'un opérateur d'affectation aussi, comme std :; conteneurs vont l'utiliser.

Je me bats avec une application C / C ++, nous développons, et les premières idées qui me viennent à l'esprit sont

  • Un pointeur a été modifié et son pointage à un possition non valide (PTR ++;) ou quelque chose comme ça
  • .
  • Vous avez libéré l'objet, mais le pointeur tient toujours la direction.

    Un outil comme Valgrind peut vous aider à détecter d'éventuelles erreurs dans le code. Pour installer:

    sudo apt-get install valgrind

    Et pour l'utiliser:

    valgrind --tool = memcheck --leak-check = full ...

    Il signale des erreurs alors que le programme est en cours d'exécution, et il vous donnera également un rapport après la fin du programme. Le seul problème est que valgrind identifie comme un éventuel problème ne peut pas être un vrai problème. Mais il est un point de départ.

Il est très certainement une mauvaise valeur de chaîne. En utilisant std :: string aider peut-être à cet égard si elle est un problème de pointeur ballants. Assurez-vous également toute la chaîne initialisations travail comme prévu.

Si je comprends bien la classe, vous assumez que quelle que soit la mémoire réside à m_cstring ne sera pas désallouée pour la durée de vie de la classe. Ce qui dans votre cas signifie aussi pour la durée de vie des conteneurs. Vérifiez vos champs d'application.

Un autre problème que vous pouvez rencontrer est si votre Destructeur est supprimer le cstring puis en utilisant une valeur par défaut dans le constructeur est une très mauvaise idée que vous allez essayer de désaffecter une cstring allouée statiquement.

Il est possible en C ++ pour définir une fonction qui est censé retourner une chaîne, mais ne retourne rien et vous vent avec une mauvaise chaîne (Généralement, le compilateur va attraper la « fin atteint de la fonction non vide » , mais pas toujours).

Même chose sur l'utilisation valgrind.

Comme un additif après avoir lu divers commentaires, il y a toujours la possibilité qu'une erreur de mémoire quelque part ailleurs dans le programme corrompu l'une des chaînes.

EDIT 4-16

À ce stade, je vérifier les valeurs de l'objet sont bien formés sur construction / destruction. (Essayez de les imprimer?) Si tout semble bon, vous devrez peut-être chercher ailleurs dans votre code pour l'erreur.

Qu'est-ce que l'intérieur de votre destructor? Probablement il ne libère de la cstring. Et si c'est le cas, alors vous partagez votre pointeur cstring sur les instances et chaque instance puis libère le même pointeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top