在分段错误之前缺少cout

时间:2013-04-07 11:54:53

标签: c++ gcc netbeans segmentation-fault cout

我的代码中存在分段错误,所以我在可疑方法上放了很多cout来定位到哪里。

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
    } ...

如果该方法被调用并且没有来自T1和之前的每个cout的段错误。 在行++中,tmp是段错误,因为ostatnioUlozony为NULL,当方法转到T2时,每个cout没有先打印。为什么呢?

我正在使用Netbeans ang gcc,我在Netbeans中找到了“segfault line”和调试,但在我使用之前,我花了一些时间来添加cout line和运行程序。

非常感谢,

2 个答案:

答案 0 :(得分:7)

您需要使用std::flushstd::endl(也会提供换行符)来刷新输出流,否则您无法保证看到输出:

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

尽管如此,如果你增加一个奇异的迭代器(空指针是),你有未定义的行为,所以这只是可能才能工作。就C ++而言,你的程序可能会发射核导弹。

答案 1 :(得分:1)

另一个解决方案是使用std :: cerr而不是std :: cout。它是无缓冲的,因此不需要刷新,并且使用std :: cerr进行调试更加惯用。