5

我的代码中存在分段错误,因此我在可疑方法上放置了许多 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 时,每个没有 first 的 cout 都没有打印。为什么?

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

非常感谢,

4

2 回答 2

9

您需要使用std::flushor刷新输出流std::endl(这也将给出一个换行符),否则您不能保证看到输出:

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

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

于 2013-04-07T11:55:59.117 回答
1

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

于 2013-04-08T10:20:12.353 回答