2012-10-23 70 views
1

将文件内容读入std :: string时遇到coredump。代码如下列表:coredump:将文件内容读入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功能倒掉。但我不知道为什么抛出异常。阅读时该文件可能会被删除,但代码中的哪个语句可能导致抛出异常?

+0

我在'filebuf :: underflow()'中发现了四个地方,它们可能因为四种不同的原因而抛出'std :: ios :: failure'(参见'fstream.tcc')。把catch块放在某个地方,看看会发生什么。 – jrok

回答

1

从栈跟踪中可以清楚地看到异常是从content.assign中抛出的。看起来像string::assign是一个内联函数,它调用std::string::_M_replace_dispatch。你可以通过查看头文件或者使用调试器来检查。这是否回答了这个问题?

+0

我认为应用因遇到IO异常而中止。我通过捕获异常来解决问题。 – LiJunjie

相关问题