0

私は、各ノードが次のように見える行のリンクリストを持つファイルを扱っています:

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

textそして、次のような関数を呼び出して、変数で見つかった行の先頭にスペースを追加する関数を書いていますlinelist_ptr->text.insert(0,1,'\t');

プログラムはコンパイルされますが、実行すると次のエラーが発生します。

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

何か案は?

4

3 に答える 3

1

コードのどこかで std::string::at() を使用していますが、間違ったインデックスを渡しているため、スローされます。例外をキャッチしないため、main() から伝播され、terminate() が呼び出され、プロセスが強制終了されます。

std::string::insert() は std::string::at() を呼び出さず、パラメーターも呼び出さないため、示したコードはそのように失敗することはありません。コードに例外処理を追加してください。それでもバグが見つからない場合は、コードのより大きなセクション (またはファイル全体を、できればhttp://codepad.orgに投稿してください) を投稿してください。

于 2010-05-27T03:40:32.830 に答える
1

あなたが説明したことから最も可能性の高い問題は、insert() が文字列の末尾から離れた無効な位置 (つまり > size()) で呼び出されていることだと思います。この例は、呼び出している関数にていると言うので、上記のサンプル コードとは異なる位置を渡している可能性がある場所に記述したものを確認し、値が期待どおりであることを確認してください。

終了メッセージは、out_of_range(try/catch ブロックを介して) 例外を処理していないためです。そのため、C++ 言語ランタイムまでエスケープされ、プログラムが突然シャットダウンされます。

于 2010-05-27T06:52:45.793 に答える
0

正当な値を持っていることを確認しlinelist_ptrます。つまり、編集したことを確認します (使用する前にnew編集していないこと)。delete

于 2010-05-27T03:40:10.240 に答える