2012-12-12 49 views
1

我使用的是Ubuntu。 g ++版本4.7.2。gnu slist執行錯誤:文件丟失.../bits/allocator.h:沒有這樣的文件

任何人都可以幫我使用gnu-extension單個列表嗎?我編譯了這裏的東西,執行時得到了一個核心轉儲。

我放聲大哭,看到核心轉儲發生在第一行,它拋出了一個我無法解決的錯誤。任何人都可以請幫助我?

錯誤代碼:

std::allocator<char>::allocator (this=0x7fffffffe4d0) 
at /build/buildd/gcc-4.7-4.7.2/build/x86_64-linux-gnu/libstdc++-v3/include/bits/allocator.h:104 
104 /build/buildd/gcc-4.7-4.7.2/build/x86_64-linux-gnu/libstdc++-v3/include/bits/allocator.h: No such file or directory. 

這是我的測試代碼:

#include <ext/slist> 
#include <cstring> 
#include <iostream> 

int main(int argc, char * argv[]) 
{ 
    __gnu_cxx::slist<char> li(&argv[1][0], &(argv[1][strlen(argv[1])])); 

    if(argc != 3) 
     return 1; 

    std::cout << "SList: "; 
    for(__gnu_cxx::slist<char>::iterator i = li.begin(); 
      i != li.end(); 
      ++i) 
     std::cout << *i; 
    std::cout << std::endl; 

    li.remove(argv[2][0]); 

    for(__gnu_cxx::slist<char>::iterator i = li.begin(); 
      i != li.end(); 
      ++i) 
     std::cout << *i; 
    std::cout << std::endl; 

    return 0; 
}//main 
+0

你確定這不是一個構建錯誤嗎?沒有找到.h聽起來像是一個構建錯誤。 – RonaldBarzell

+0

@ user1161318:調試器試圖顯示程序崩潰的源代碼行,但找不到必需的文件。 –

回答

2

我的猜測是,你當你運行它會不會給任何命令行參數。它期望兩個:放入列表中的字符序列和要移除的字符序列。

更新:由於在評論中提到的,使用gdb時傳遞參數給你的程序,你需要使用--args選項,表明以下程序名稱參數應該傳遞給程序,而不是gdb本身:

gdb --args a.out xxyyxx x 
    ^^^^^^ 

它初始化從第一個參數argv[1]之前檢查這樣的說法存在列表;如果沒有,那麼你會得到未定義的行爲。如果您移動li聲明上方的檢查,那麼程序應退出並返回代碼1,而不是在這種情況下。

然後調試器抱怨說它找不到源文件,所以不能顯示它出錯的源代碼行。

順便說一下,C++標準庫現在包含一個單鏈表,std::forward_list,定義於<forward_list>,您可以使用它來代替GNU的擴展。

+0

...我不是...挑戰...我自己寫了測試代碼。僅僅爲了方便使用argv。 – Adam

+0

@亞當:好的,如果我冒犯了你,對不起。唯一能讓你的程序崩潰的方法就是不加任何參數地運行它。它按預期工作,否則。你用什麼理由調用這個程序? –

+0

哦,forward_list是一個單子嗎?哦耶。我認爲我應該在slist上編寫C++ 11功能的實現,現在我可以使用forward_list。謝謝! – Adam

相關問題