Std::string::empty() const()不抛出的分段错误
std::string::empty() const () segfault without throwing
我遇到了一个奇怪的问题,我不知道怎么解决。
for ( const auto & p : _patterns )
{
auto it = std::find_if( p->Tokens().begin(),p->Tokens().end(),
[&]( const Token & lhs )
{
return ( lhs == query );
});
if ( it != p->Tokens().end() )
d_freq++;
}
标记:
std::vector<Token>
和std::find_if lambda内部的实际操作符,定义和实现为:
bool Token::operator== ( const Token & rhs ) const
{
if ( !this->_value.empty() && !rhs._value.empty() )
{
return boost::iequals( this->_value, rhs._value );
}
else
throw
std::runtime_error ( "[Token::operator==] empty string" );
}
运行我的调试版本只是崩溃与SEGFAULT。
只有当我运行gdb,然后反向跟踪,我得到:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff721b173 in std::string::empty() const () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
(gdb) backtrace
#0 0x00007ffff721b173 in std::string::empty() const () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#1 0x00000000005b082d in Token::operator== (this=0xc35818, rhs=...) at /Token/Token.cpp:37
#2 0x00000000005ee12a in TFIDF::Calculate(std::vector<Token, std::allocator<Token> >, Token)::{lambda(Token const&)#1}::operator()(Token const&) const (__closure=0x7fffffffd840, lhs=...)
我觉得这很奇怪,因为,如果我理解正确的话,它应该抛出一个漂亮的异常,但它没有。
更有趣的是,就在我调用导致它崩溃的方法(TFIDF::Calculate)之前,我使用相同的令牌、相同的std::find_if和完全相同的lambda进行了非常相似的搜索,它没有崩溃!我显然遗漏了一些东西,所以有人可以帮助吗?
如注释中所述,Tokens()
按值返回std::vector<Token>
。这意味着下面的代码将比较两个不同的vector
的begin
和end
迭代器,这是未定义的行为。
auto it = std::find_if( p->Tokens().begin(),p->Tokens().end(),
[&]( const Token & lhs )
{
return ( lhs == query );
});
要解决这个问题,可以修改 正如@WhozCraig所建议的,这可以进一步简化为Tokens()
,使其通过引用返回std::vector
,或者将返回值存储在变量中。auto tokens = p->Tokens();
auto it = std::find_if( tokens.begin(), tokens.end(),
[&]( const Token & lhs )
{
return ( lhs == query );
});
auto tokens = p->Tokens();
auto it = std::find(tokens.begin(), tokens.end(), query);
if ( it != tokens.end() ) // don't use p->Tokens() here either!! :)
d_freq++;
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?