5

コードにセグメンテーション違反があったため、疑わしいメソッドに多くの計算を実行して、場所をローカライズしました。

bool WybierajacyRobot::ustalPoczatekSortowania(){
    cout << "ustal poczatek sortowania: " << poczatekSortowania << endl ;
    list< Pojemnik >::iterator tmp;
    cout << "LOL"; // <-- this cout doesn't print when segfault

    if (!poczatekSortowania){   // <- T1
        cout << "first task" ;
        tmp = polka.begin();
    }
    else{   // <-- T2
        cout << " second task " ;// <-- this cout doesn't print when segfault
        tmp = ostatnioUlozony;
        cout << " debug cout " ; // <-- this cout doesn't print when segfault
        ++tmp; // <-- segfault
    } ...

メソッドが呼び出され、segfault がない場合、T1 以前のすべての cout が出力されました。ostatnioUlozony が NULL であるため、行 ++tmp は segfault です。メソッドが T2 に移動すると、最初のなしですべての cout が出力されませんでした。なんで?

私は Netbeans と gcc を使用しています。Netbeans のデバッグで「segfault 行」を見つけましたが、使用する前に、cout 行の追加とプログラムの実行に時間を費やしています。

どうもありがとう、

4

2 に答える 2

9

std::flush出力ストリームを or のいずれかでフラッシュする必要がありstd::endlます(改行も生成されます)。そうしないと、出力が表示されることが保証されません。

cout << " second task " << std::flush;

それにもかかわらず、単一の反復子 (null ポインター) をインクリメントすると未定義の動作が発生するため、これは機能する可能性が高いだけです。C++ に関する限り、プログラムは代わりに核ミサイルを発射することができます。

于 2013-04-07T11:55:59.117 に答える
1

別の解決策は、std::cout の代わりに std::cerr を使用することです。バッファリングされていないため、フラッシュは必要ありません。デバッグ目的で std::cerr を使用する方が少し慣用的です。

于 2013-04-08T10:20:12.353 に答える