8
votes

Signal reçu du programme SIGSEGV, défaut de segmentation

OK ... je déchirige mes cheveux ... Pourquoi suis-je la segmentation Fauls quand je passe une chaîne appelée "Nom" avec le contenu "Joel" dans

class person {
public:
    int getID();
    string getName();

    void setID(int newID);
    void setName(string newName);
private:
    int personID;
    string personName;

};


10 commentaires

Aussi ... il fonctionne sur les itérations précédentes sans faute ... cela n'aimait pas cette itération ... je voudrais lier le code mais il y a des seaux de la substance x (


Je ne pense pas que votre problème est cette fonction. Vous voudrez peut-être examiner comment vous créez / accédez à l'objet de la personne que vous utilisez.


Votre exemple de code est correct, le Segfault est causé ailleurs. Veuillez intervenir votre code avec un débogueur pour trouver la ligne de code provoquant l'erreur.


@falconmick: Veuillez réduire votre code au minimum minimum possible et postez-le ici. Il n'y a pas de problème avec le code ci-dessus, isolément, au moins.


De plus, le nom de la personne variable égalée (dans mes montres) "Le programme étant débogué a été signalé lors d'un appel de la fonction de GDB"


Euh, vous dites que cette chaîne "Le programme étant débogué ..." était le contenu de cette variable? Très étrange. Pouvez-vous nous dire quelle ligne de code le défaut est sur? Créez le programme avec -g (si vous utilisez GCC), puis exécutez-le dans GDB. Il va casser l'erreur. Si vous ne reconnaissez pas où vous êtes, tapez bt qui affichera la pile d'appels de fonction. Recherchez la pile jusqu'à ce que vous trouviez une partie de votre code - c'est la ligne avec l'erreur.


@mgiuca: Pour être précis, ce serait la ligne avec le symptôme . L'erreur réelle pourrait être ailleurs.


@MGIUCA: GDB vient de confirmer que ce pointeur est invalide au moment de l'évaluation. +1 pour utiliser un débogueur, BTW


@Oli chalesworth / @sehe en effet. J'essayais de simplifier les choses mais j'ai peut-être trop simplifié. Pour montrer que je sais ce que je suis sur quoi je suis sur quoi;) J'ai écrit un guide pour déboguer ces problèmes: ww2.cs.mu.oz.au/~mgiuca/253/bad.html Peut-être peut-être que ce sera utile.


@MGUICA: HA - Belle recherche (BGCC, autrefois non connue de moi). Cependant, comme le débogage des itérateurs stl et le débogage des allocateurs de tas, ils sont tous pâles par rapport au fondamentalisme pure de Valgrind; Il vérifie positivement Toutes les références de mémoire UnitéInalisées / non définies , que ce soit dans ou hors limites (en plus de faire la vérification des fuites) - tout sans même nécessiter des constructions de débogage ni de tout compilateur spécifique. Qui rochers


3 Réponses :


1
votes

Probablement, vous êtes la déréférence d'un pointeur de voyou. Par puringavision, avez-vous quelque chose comme ça, peut-être: xxx

Le problème peut être:

  • L'erreur comme indiqué, l'index est basé sur 0. Vous avez donc besoin de pour (i = 0; i <10; i ++)
  • Si le tableau est alloué de manière dynamique, mais l'index est toujours hors limites

    Il pourrait littéralement être des centaines d'autres causes, mais que je n'ai pas votre code, c'est ma tentative de deviner la plupart des erreurs plausibles;)

    ( note Self: pourquoi je fais-je cela / je ne suis pas psychique? )


0 commentaires

20
votes

Si vous êtes sous Linux, essayez d'exécuter Valgrind . Vous venez de compiler avec -g (avec GCC), puis exécutez votre programme avec Valgrind devant: xxx

Contrairement aux solutions GCC , qui vous disent que lorsque le segfault se produit, Valgrind vous indique généralement exactement lorsque la première corruption de la mémoire se produit, vous pouvez donc attraper le problème beaucoup plus près de sa source.

ps. Il rime avec "silex", pas "trouver".


1 commentaires

+1 pour donner la bonne prononciation de Valgrind ('valgreend')



-2
votes

Le code a l'air bien du fait que vous copiez la chaîne tout le temps. Au lieu de

void setName(const string& newName);


2 commentaires

-1: Vous avez seulement dit que «semble bon» sans tentative de résoudre le problème. Les petits détails que vous avez fournis sont principalement non pertinents, car si la chaîne est copiée une ou deux fois ne doit pas faire d'impact ici. Au mieux, votre message devrait être un commentaire à la question initiale. Il est probable que vous n'ayez pas les points requis pour faire des commentaires, essayez simplement de répondre à des scores - mais faites-le raisonnablement. Cette question (et votre réponse aussi) manque de détails et il est tout à fait improbable d'aider quiconque à l'avenir. Vous êtes très peu susceptible de marquer dans ce poste et de réponses de commentaire.


"Le problème doit être dans l'invocation de la méthode." Cela signifie que le code est médiocre, mais n'a pas d'erreur.