2

ファイルの内容をstd::stringに読み取るときに、コアダンプが発生します。コードは以下のリストです:

bool readContentFromFile(const char* fileName, std::string& content)
{
    std::ifstream t(fileName);
    if(!t) {
        return false;
    }

    t.seekg(0, std::ios::end);   
    content.reserve(t.tellg());
    t.seekg(0, std::ios::beg);

    content.assign((std::istreambuf_iterator<char>(t)),
                std::istreambuf_iterator<char>());
    return true;
}

ただし、コードによって次のようなコアダンプが発生する場合があります。

...
#4  <signal handler called>
#5  0x00007f347a0f3945 in raise () from /lib64/libc.so.6
#6  0x00007f347a0f4f21 in abort () from /lib64/libc.so.6
#7  0x00007f347a953504 in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib64/libstdc++.so.6
#8  0x00007f347a951946 in ?? () from /usr/lib64/libstdc++.so.6
#9  0x00007f347a951973 in std::terminate() () from /usr/lib64/libstdc++.so.6
#10 0x00007f347a951a5a in __cxa_throw () from /usr/lib64/libstdc++.so.6
#11 0x00007f347a8ef2ba in std::__throw_ios_failure(char const*) () from /usr/lib64/libstdc++.so.6
#12 0x00007f347a901317 in std::basic_filebuf<char, std::char_traits<char> >::underflow() () from /usr/lib64/libstdc++.so.6
#13 0x00000000004c2751 in char* std::string::_S_construct<std::istreambuf_iterator<char, std::char_traits<char> > >(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> >, std::allocator<char> const&, std::input_iterator_tag) ()
#14 0x00000000004c281b in std::string& std::string::_M_replace_dispatch<std::istreambuf_iterator<char, std::char_traits<char> > >(__gnu_cxx::__normal_iterator<char*, std::string>, __gnu_cxx::__normal_iterator<char*, std::string>, std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> >, std::__false_type) ()
#15 0x00000000004bf225 in readContentFromFile(char const*, std::string&) ()

上記のコードスニペットから、underflow関数で例外がスローされます。しかし、なぜ例外をスローするのかわかりません。読み取り時にファイルが削除される可能性がありますが、コード内のどのステートメントが例外のスローを引き起こす可能性がありますか?

4

1 に答える 1

1

スタックトレースから、例外がからスローされていることがかなり明確になりますcontent.assignstring::assignを呼び出すインライン関数のように見えますstd::string::_M_replace_dispatch。これは、ヘッダーファイルを確認するか、デバッガーを使用して確認できます。それは質問に答えますか?

于 2012-10-23T06:56:46.813 に答える