2013-04-07 95 views
2

我的代碼中存在分段錯誤,因此我在可疑方法中放置了很多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行和運行程序。

非常感謝,

+0

如果您想跟蹤程序中的執行流程,您應該使用調試器 – 2013-04-07 11:56:35

+0

我這樣做了,但我想知道爲什麼我沒看到cout – 2013-04-07 12:03:31

+0

那麼您應該接受@ sftrabbit的答案。 – 2013-04-07 12:04:58

回答

5

您需要刷新與輸出流或者std::flushstd::endl(這將給換行符也一樣),否則你不能保證看到的輸出:

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

儘管如此,如果你增加一個單數迭代器(空指針),你有未定義的行爲,所以這隻有可能工作。就C++而言,您的程序可能會啓動核導彈。

+0

謝謝:)當我遞增迭代器時,我不知道它是NULL – 2013-04-07 12:08:05

0

另一種解決方案是使用std :: cerr而不是std :: cout。它是無緩衝的,所以不需要刷新,並且爲了調試目的使用std :: cerr稍微習慣一些。