2010-05-27 17 views
0

je traite un fichier avec une liste chaînée de lignes avec chaque nœud qui ressemble à ceci:std :: out_of_range erreur?

struct TextLine{ 
    //The actual text 
    string text; 
    //The line number of the document 
    int line_num; 
    //A pointer to the next line 
    TextLine * next; 
}; 

et j'écris une fonction qui ajoute des espaces au début des lignes trouvées dans la text variables , en appelant des fonctions comme linelist_ptr->text.insert(0,1,'\t');

Le programme compile, mais quand je le lance je reçois cette erreur:

terminate called after throwing an instance of 'std::out_of_range' 
    what(): basic_string::at 
Aborted 

Toutes les idées?

+2

Vous n'avez pas fourni suffisamment d'informations. Le code que vous avez donné ne peut pas échouer de la manière que vous décrivez, alors peut-être qu'un autre code échoue que vous n'avez pas mis ici. – Omnifarious

+3

Quelle est la raison pour laquelle vous n'utilisez pas 'std :: list'? (Devoir?) Ou encore mieux, 'std :: vector', ou' std :: deque'. – GManNickG

+1

Pouvez-vous vérifier si votre implémentation, par hasard, utilise 'char *' comme 'string :: iterator'? Vous pouvez faire '#include ', puis 'std :: cout << typeid (std :: string :: iterator) .name()' - et indiquer le résultat. –

Répondre

0

Vérifiez que linelist_ptr a une valeur légitime, à savoir que vous avez new Éd (et il n'a pas été delete d avant que vous l'utiliser)

+0

Aucun de ces lancera std :: out_of_range, jamais. Tous sont des comportements indéfinis et sont susceptibles de simplement entraîner une erreur de segmentation. – CMircea

+2

Ce que je pensais était que si le pointeur pointait vers un emplacement poubelle qui a ensuite été interprété comme une chaîne std :: string lorsque l'appel a été fait. – hamishmcn

+0

Il déréférencé le pointeur. Comment cela pourrait-il entraîner at() être appelé? – CMircea

1

Vous utilisez std :: string :: à () quelque part dans votre code, mais vous lui passez un index incorrect, d'où il jette. Puisque vous n'attrapez aucune exception, elle se propage hors de main() et terminate() est appelée, ce qui tue le processus.

Le code que vous avez montré ne peut pas échouer de cette façon, car std :: string :: insert() n'appelle pas std :: string :: at(), ni les paramètres. S'il vous plaît ajouter la gestion des exceptions à votre code et si vous ne trouvez toujours pas le bug s'il vous plaît poster une plus grande section de votre code (ou le fichier entier, à http://codepad.org de préférence).

+3

Ceci est faux. ISO C++ 03 spécifie que 'insert()' devrait lancer 'std :: out_of_range' si l'index est hors plage (21.3.5.4 [lib.string :: insert]/3:" Throws: out_of_range if pos1> taille () ou pos2> str.size(). "). Il est parfaitement légal d'implémenter cette exigence en appelant 'at()'. –

+1

@Pavel, d'accord. Cependant, ce n'est pas la cause car l'index est 0 - ce qui est dans la plage de toute chaîne std :: string valide. – CMircea

1

Je pense que le problème le plus probable de ce que vous avez décrit est que invocation() est invoquée avec une position invalide à la fin de la chaîne (c'est-à-dire> taille()). Vous dites que cet exemple est comme les fonctions que vous appelez, donc vérifiez celles que vous avez écrites où vous pourriez passer position différemment de l'exemple de code ci-dessus et assurez-vous que la valeur est ce que vous attendez. Le message de fin est parce que vous ne gérez pas l'exception out_of_range (via des blocs try/catch), de sorte qu'il s'échappe jusqu'à l'exécution du langage C++, ce qui arrête sans cérémonie votre programme.