2010-10-12 4 views
2

J'essaie d'utiliser G ++ pour compiler du code C++. Il semble fonctionner correctement dans d'autres compilateurs, mais pour une raison quelconque, G ++ ne produira pas de sortie de travail.C++ en G ++ - Erreur de segmentation lors de l'utilisation de pointeurs

Divulgation: Cela fait partie d'un devoir, mais je pense que c'est plus un problème de compilateur, car cela fonctionne dans d'autres compilateurs.

est ici l'extrait qui a fait des ravages:

set<int> t1, t2; 

Il est étrange parce que le code suivant fonctionne très bien:

set<int> *t1 = new set<int>(); 
set<int> *t2 = new set<int>(); 

D'accord, je dois utiliser -> au lieu de ., mais ce qui est attendu. Le premier extrait génère une erreur de segmentation lors de l'exécution. La seconde fait intuitivement ce que je m'attendais à.

Quoi qu'il en soit, dans les coulisses, le .cpp pour set a ceci:

#include <cstdlib> 
#include <iostream> 

using namespace std; 

template <class T> 
set<T>::set() : bag<T>() {} 

template <class T> 
set<T>::set(const set<T>& b) : bag<T>(b) {} 

Le .h ressemble à ceci:

#include "bag.h" 

template <class T> 
class set : public bag<T> 
{ 
    public: 
     set(); 
     set(const set &b); 

// ... 

}; 
#include "set.cpp" 

Et last but not least, les fichiers bag.cpp et bag.h ressemble ceci:

using namespace std; 

template <class T> 
bag<T>::bag() { 
    head = NULL; 
} 

template <class T> 
bag<T>::bag(const bag<T>& b) { 

    // ... 

} 

et bag.h:

template <class T> 
class bag 
{ 
    public: 
     bag(); 
     bag(const bag &b); 

    // ... 
}; 
#include "bag.cpp" 

Encore une fois, je me sens comme G ++ me déteste juste, mais là encore je pourrais faire quelque chose de stupide. Juste un simple coup de pouce dans la bonne direction serait génial.

+5

'Utiliser l'espace de nom std' combiné avec le fait de nommer votre classe de la même façon qu'un nom de bibliothèque standard (' set') ne peut que se terminer en larmes. –

+4

Que font exactement les destructeurs de 'set' et' bag'? (Lorsque vous créez un objet dans la pile comme dans le premier fragment de code, l'objet est détruit à la fin de son bloc englobant la portée.Lorsque vous créez dynamiquement un objet en utilisant 'new' comme dans le second extrait de code, l'objet est détruit quand vous le "supprimez".Si vous ne le supprimez jamais, le destructeur ne sera jamais appelé; Je suppose que quelque chose dans le destructeur est probablement la cause de votre problème ''). –

+0

@James: J'ai renommé la classe en 'discret_set'. Aucun effet. Quant au destructeur, il itère une liste chaînée et supprime la valeur de chaque nœud. Rien d'extraordinaire, mais je vais bricoler et vous faire savoir. Merci pour l'instant! – mattbasta

Répondre

8

Voici un indice général qui vous rendra la vie un million de fois plus facile.

Compile ce programme avec les drapeaux "-g" et "-Wall":

gcc -g -Wall foo.cpp 

Le "-g" ajoute des informations de débogage. Le "-Wall" crache des avertissements supplémentaires lors de la compilation. Ensuite, utilisez le débogueur:

gdb ./a.out 

Hit run pour démarrer votre programme. Utilisez bt pour vider votre pile d'appels une fois que votre code se bloque. Vous pouvez alors voir exactement où l'accident se produit dans votre code.

Alors que vous y êtes, google "tutoriel gdb". Passer une heure ou deux à apprendre comment utiliser gdb correctement se remboursera, avec intérêt. Je vous promets.

+2

Wow étais-je éteint. Et aussi, ** sainte merde **. La meilleure chose au monde. 'gdb' est mon nouveau" jouet "préféré. Très appréciée! – mattbasta

Questions connexes