2011-07-17 3 views
2

Im travaillant sur ce bit de code et je continue à obtenir un défaut de segmentation. Pour la vie de moi je ne peux pas comprendre pourquoi, je sais qu'un défaut de segmentation est quand vous essayez de suivre un pointeur nul, mais la chose est, dans mon code "u-> précédent" n'est pas nul, ni est "u", je vérifié. Si je change la condition dans la boucle while à (u! = NULL), il va itérer deux fois avant de faucher sur "u-> isGreen", Encore une fois, j'ai vérifié chaque itération pour voir si vous étiez nul. "Nodes" est un tableau de pointeurs vers des objets Node réels. Je sais avec certitude que le "u-> précédent" existe dans mes noeuds et "isGreen" est initialisé à false;C++ erreur de segmentation insaisissable

Heres la classe Node, dans le cas où vous souhaitez voir que:

class Node { 
    public: 
     GLfloat x, y, z; 
     int numLinks; 
     Node *link1; 
     Node *link2; 
     GLfloat distance; 
     Node *previous; 
     bool isGreen; 

     Node(GLfloat x, GLfloat y, Node *link1, Node *link2); 
     Node(GLfloat x, GLfloat y, Node *link1); 
     Node(); 
     Node(GLfloat x, GLfloat y); 
     ~Node(); 

     bool dijkstra(Node* graph[], Node *source, Node *target); //returns true if a path to target is found 
     int dist(Node *n1, Node *n2); 
     int extractOptimalPath(Node* graph[]); 
}; 

Quelle pourrait être la cause du défaut de seg?

+1

vous devez également inclure l'implémentation de la classe 'Node'. –

+0

Quelle est la relation entre 'extractOptimalPath()' et 'extractOptimalPath (Node * graph []);'? – cnicutar

+0

Avez-vous utilisé un débogueur? Cela peut aider à savoir exactement ce que «u» indique (ce n'est pas vraiment suffisant pour savoir que ce n'est pas «0»). –

Répondre

7

Cette erreur n'est pas juste pour les pointeurs NULL, c'est un pointeur qui pointe vers quelque chose d'invalide. Cela peut être nul, mais cela peut aussi être une mémoire qui a été libérée.

+0

Des raisons supplémentaires peuvent inclure un noeud corrompu par une écriture frauduleuse ou l'utilisation d'un noeud mal initialisé. –

+0

Je pense que vous avez raison de dire que c'est de la mémoire qui a été libérée. (Débogué) Que faut-il faire pour l'empêcher d'être libéré? – Matt

+0

@Matt: ne pas le libérer.En utilisant des pointeurs intelligents et RAII, et en suivant la Règle de Trois (tous ces éléments sont bien documentés sur SO et sur Wikipedia et d'autres endroits) – jalf

4

Je ne vois pas de constructeur de copie dans le nœud, alors que je vois des pointeurs et un destructeur. Donc, vous avez violé le Rule of Three. En conséquence, si vous copiez accidentellement un nœud, le destructeur de cette copie produira des effets que vous voyez maintenant.

Mise à jour: Pour tester rapidement pour cela, ajoutez un constructeur de copie privée à votre classe Node, comme ceci:

class Node { 
... 

private: 
    Node(const Node&); 
}; 

Si vous obtenez des erreurs du compilateur maintenant, vous faites des copies. Le compilateur vous indiquera les endroits où cela se produit.

0

Vous n'avez pas besoin d'avoir un pointeur NULL pour avoir une erreur de segmentation, cela se produit chaque fois que vous accédez à la mémoire hors de votre portée autorisée. Vérifiez le fil What is a segmentation fault?.

Votre code n'est pas suffisant pour dire ce qui cause un défaut de segmentation. Le plus probable u->previous dans un de vos nœuds pointe vers un endroit plus ou moins aléatoire dans la mémoire, mais c'est juste une supposition.

0

Ma conjecture est que dans votre constructeur d'un objet Node, le pointeur précédent n'est jamais défini sur NULL à aucun moment. Vous devriez avoir un point où previous est défini sur NULL (dans votre code actuel, ne supposez pas que le code le fait automatiquement pour vous). En outre, en guise de conseil, essayez d'utiliser gdb to step through your code. Une autre astuce, valgrind est habituellement utilisée pour consulter les fuites de mémoire, mais je l'ai utilisé pour identifier avec succès les erreurs de segment.