begin process at 2012 05 30 08:48:21
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Maths

 > 

Segfault bizarre sur un "cout"


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Segfault bizarre sur un "cout"

vendredi 22 octobre 2010 à 13:20:21 | Segfault bizarre sur un "cout"

Thunder255

Bonjour à tous,
Voilà je fais face à un problème assez bizarre :
Code C/C++ :
int main() {

  Graph g = Graph(5, 0.5);
  //g étant de type list<list<Node*> >
  //représentant un graphe implémenté grace à des liste d'adjacence
  cout << g;
  cout << endl;
  
  return 0;
}

Ne provoque aucune erreur et le programme se termine correctement.

Parcontre un :
Code C/C++ :
int main() {

  Graph g = Graph(5, 0.5);
  
  cout << g << endl;
  
  return 0;
}

Provoque un segfault. Voila le retour d'erreur de Valgrind :
Code :
==18337== Invalid read of size 4
==18337==    at 0x40B6E9E: std::ostream::sentry::sentry(std::ostream&) (in /usr/lib/libstdc++.so.6.0.13)
==18337==    by 0x40B7AB8: std::basic_ostream >& std::__ostream_insert >(std::basic_ostream >&, char const*, int) (in /usr/lib/libstdc++.so.6.0.13)
==18337==    by 0x40B7EBB: std::basic_ostream >& std::operator<<  >(std::basic_ostream >&, char const*) (in /usr/lib/libstdc++.so.6.0.13)
==18337==    by 0x804AD9C: main (in /autofs/netapp/travail/uti/lfournie/Master/m2/amr/amr-project/main)
==18337==  Address 0x7d49bbf0 is not stack'd, malloc'd or (recently) free'd


Une idée sur ce comportement bizarre ?

Voici les deux surchages des opérateur "<<" sur le type Graph() et Node() :
Code C/C++ :
ostream & operator <<(ostream&, const Graph &g) {
  list<list<Node*> > lnodes = g.l_nodes;
  list<list<Node*> >::iterator i;

  for (i = lnodes.begin(); i != lnodes.end(); i++) {
    list<Node *>::iterator j;
    for (j = i->begin(); j != i->end(); j++){
      cout << **j;
    }
    cout << endl;
  }

Code C/C++ :
ostream& operator <<(ostream&, const Node &n){
  cout << "[Value : "<< n.getValue() << ", Color : " << n.getColor() << ", @ :" << &n << "]";

}



Merci d'avance pour votre aide !
vendredi 22 octobre 2010 à 14:06:29 | Re : Segfault bizarre sur un "cout"

CptPingu

Administrateur CodeS-SourceS
Plusieurs choses:
- Évite l'utilisation de using namespace, voir: [ Lien ]
- Tu fais une copie inutile dans ton code: list<list<Node*> > lnodes = g.l_nodes;. C'est assez violent parce que tous est recopié ! Un pointeur ou une référence dessus aurait été plus souhaitable, voir d'utiliser directement g.l_nodes.
- Ou est le "return", qui est super important pour chainer des actions ? (Sûrement la cause de ton bug).
- Attention, grosse différence de performance entre ++i et i++ sur un objet iterator !!! L'un incrémente (++i) et l'autre recopie puis somme la copie et l'élément courant (i++ <=> i = i.copie() + 1 si tu préfères);. Prend la bonne habitude de faire ++i, si tu as le choix entre ++i et i++. Tu ne te tromperas ainsi jamais, quelque soit le type de donnée.
- Quand on redéfini un opérateur de flux, on utilise le flux courant, et non std::cout.

Code C/C++ :
std::ostream& operator<<(std::ostream& out, const Graph &g)
{
  typedef list<list<Node*> >::iterator iter;
  typedef list<Node*>::iterator subIter;
  for (iter i = g.l_nodes.begin(); i != g.l_nodes.end(); ++i)
    for (subIter j = i->begin(); j != i->end(); ++j)
      out << **j;
    out << endl;
  return out;
}

std::ostream& operator<<(std::ostream& out, const Node &n)
{
  out << "[Value : "<< n.getValue() << ", Color : " << n.getColor() << ", @ :" << &n << "]";
  return out;
}



________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
vendredi 22 octobre 2010 à 17:21:00 | Re : Segfault bizarre sur un "cout"

Thunder255

Merci CptPingu pour ton aide, mon problème est résolu :)

Ou est le "return", qui est super important pour chainer des actions ? (Sûrement la cause de ton bug).



En effet je pense que le bug venait de là, j'ai bien retourné le flux courant comme tu l'a mis dans ton code au lieu d'écrire directement dans "cout" et plus de sigsegv :)

J'ai aussi suivi tes autres conseils et modifié le code en conséquence.

Merci !


Cette discussion est classée dans : code, cout, bizarre, std, ostream


Répondre à ce message

Sujets en rapport avec ce message

calcul d'un modulo [ par cabarrus ] Qui peu m'aidé s.v.p pour ce problème...Ecrire un prog qui demande 2 nbres à l'utilisateur et qui affiche le reste de la division du 1er par le second problème chaines de caractères [ par tintin72 ] BonjourJ'aimerai avoir un petit éclaircissement sur les chaines de caractères.Voici un programme tout bête... char prenom[100]; cout gets(pr application windows [ par scull ] Slt, voilà j'arrive à faire quelques petit programmes en c++et je voudrais savoir comment porter mon application suivante (toute bidon)#include <iostr length [ par sheorogath ] bonjour question peut etre simple d'un debutant:je voudrais connaitre le nb de caractere dans une saisie(fenetre windows) donc j'ai fais cout<<"taper pb de définition :s truc bizarre rencontré... [ par Gendal67 ] Kikoo all! :-)Me revoila dans de nouvelles aventures...et cte coup-ci, il ne s'agit pas d'un blocage dans mon code mais d'une définition qui m'empeche Aide : Patch anti sasser.b [ par juki_webmaster ] Bonjour,Je me suis remis au developpement c++ sous dev cpp 4.Je realise un patch contre sasser.b.worm, en suivant l'indication ;http://www.symantec.co Aide [ par Hellboy67 ] Voila j'ai un exo pour les cours de prog a faire dont le code source est le suivant:# include # include using std::cout;using std::cin;using std::end Opérateur de comparaison dans une classe générique [ par benjiiim94 ] Bonjour, Je crois que pas mal d'infos sont dans le titre, il ne manque plus que la source de la classe : #pragma once #include "StdAfx.h" using n [VS.NET] Une erreur de compilation incroyable! [ par Sunsawe ] Bonjour, excusez moi mais je ne savais pas comment titrer mon message autrement. Voilà là fameuse erreur qui se suffit à elle même: Mesfunc.cpp(72) : problème de chaine de caractères (débutant) [ par graall ] salut à tous, j'ai un gros problème avec ce code : (le problème est expliqué dans les commentaires)     FILE *pReference = fopen(reference_path, "r")


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,076 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales