2016-10-07 10 views
0

セグメントフォルトが発生すると、非常に大きなセットのループが発生しますが、どこに問題がありますか?ループ受信信号SIGSEGVに対して大きな文字列セットを反復処理すると、セグメンテーションフォールト

void test(std::set<std::wstring> *names) 
    { 
     std::set<std::wstring>::iterator itr; 
     for (itr = names->begin(); itr != names->end(); ++itr) 
     { 
      std::wstring name = *itr; 

     } 

    } 

エラー:

Program received signal SIGSEGV, Segmentation fault. 
0x00007fff84b62c54 in std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t>>::basic_string(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&)>() from /usr/lib/libc++.1.dylib 
+0

コードをしばらく反復した後に終了しますか?または、ループに入った直後に終了しますか?渡されたセットがNULLでないと確信していますか? –

+0

はループの2番目の反復の後に終了しました。長さが0でない名前のみがセットに含まれます。 – Tina

答えて

0

あなたはこのMWE live at Ideoneによって示されるように、表示されたコードに問題:

#include <iostream> 
#include <set> 
#include <string> 

using namespace std; 

void test(std::set<std::wstring> *names) { 
    std::set<std::wstring>::iterator itr; 
    for (itr = names->begin(); itr != names->end(); ++itr) { 
      std::wstring name = *itr; 
    } 
} 

int main() { 
    std::set<std::wstring> s{L"aasdasd", L"badsasd"}; 
    test(&s); 
    return 0; 
} 

は、したがって、問題はどこか別の場所に示されていないあなたのコードではありません。私はgdbのようなデバッガを使って何が起こっているのかを知ることを提案したいと思います。例えば。 Linuxシステム上:

  1. gdb main
  2. runと-gフラグを付けてGDBでg++ -g main.cpp -o main
  3. 負荷をコンパイル>注意点として、スタックトレース

を読んで、forループだろうより良い、そして変更する予定がない場合names const参照(example here on Ideone):

#include <iostream> 
#include <set> 
#include <string> 

using namespace std; 

void test(const std::set<std::wstring> &names) { 
    for (auto&& name : names) { 
     std::wcout << name << std::endl; 
    } 
} 

int main() { 
    std::set<std::wstring> s{L"aasdasd", L"badsasd"}; 
    test(s); 
    return 0; 
} 
関連する問題