分割故障前缺少计数

missing cout before segmentation fault

本文关键字:故障 分割      更新时间:2023-10-16

我的代码中有一个分割错误,所以我把很多指望在可疑的方法来定位在哪里。

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和之前的每个计数都被打印。在line++中,tmp是段错误,因为ostatnioUlozony是NULL,当方法转到T2时,没有first的每个cout都不打印。为什么?

我正在使用Netbeans和gcc,我在Netbeans中找到了调试的"段故障线",但在我使用之前,我花了一些时间在添加cout行和运行程序上。

谢谢,

您需要用std::flushstd::endl(也会给出换行符)刷新输出流,否则您不能保证看到输出:

cout << " second task " << std::flush;
尽管如此,如果您递增一个奇异迭代器(空指针),则会有未定义的行为,因此只有可能起作用。就c++而言,你的程序可以发射一枚核导弹。

另一个解决方案是使用std::cerr代替std::cout。它是非缓冲的,所以不需要刷新,并且为了调试的目的使用std::cerr稍微更习惯一些。