我的代码中存在分段错误,所以我在可疑方法上放了很多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和运行程序。
非常感谢,
答案 0 :(得分:7)
您需要使用std::flush
或std::endl
(也会提供换行符)来刷新输出流,否则您无法保证看到输出:
cout << " second task " << std::flush;
尽管如此,如果你增加一个奇异的迭代器(空指针是),你有未定义的行为,所以这只是可能才能工作。就C ++而言,你的程序可能会发射核导弹。
答案 1 :(得分:1)
另一个解决方案是使用std :: cerr而不是std :: cout。它是无缓冲的,因此不需要刷新,并且使用std :: cerr进行调试更加惯用。