Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::string::empty()const()segfault而不抛出_C++_C++11_Stdstring - Fatal编程技术网

C++ std::string::empty()const()segfault而不抛出

C++ std::string::empty()const()segfault而不抛出,c++,c++11,stdstring,C++,C++11,Stdstring,我遇到了一个奇怪的问题,我搞不懂: for ( const auto & p : _patterns ) { auto it = std::find_if( p->Tokens().begin(),p->Tokens().end(), [&]( const Token & lhs ) {

我遇到了一个奇怪的问题,我搞不懂:

  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>
运行我的调试版本只是因为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=...)
程序接收信号SIGSEGV,分段故障。
来自/usr/lib/x86_64-linux-gnu/libstdc++.so.6的std::string::empty()const()中的0x00007FF721B173
(gdb)回溯
#来自/usr/lib/x86_64-linux-gnu/libstdc++.so.6的std::string::empty()const()中的0 0x00007FF721B173
#1 0x00000000005b082d位于/Token/Token.cpp:37处的Token::operator==(this=0xc35818,rhs=…)中
#TFIDF::Calculate(std::vector,Token)中的2 0x00000000005ee12a:{lambda(Token const&)#1}::operator()(Token const&)const(uu闭包=0x7fffffffd840,lhs=…)
我觉得这很奇怪,因为如果我理解正确的话,它应该抛出一个很好的异常,但事实并非如此

更有趣的是,在调用崩溃的方法(TFIDF::Calculate)之前,我使用相同的标记、相同的std::find_if和完全相同的lambda进行了非常类似的搜索,结果没有崩溃

我显然遗漏了一些东西,请有人帮忙好吗?

因为,
Tokens()
按值返回一个
std::vector
。这意味着下面的代码将比较两个不同的
向量
开始
结束
迭代器,这是未定义的行为

auto it = std::find_if( p->Tokens().begin(),p->Tokens().end(),
                        [&]( const Token & lhs )
                        {
                          return ( lhs == query );
                        });

要解决此问题,请修改
Tokens()
,使其通过引用返回
std::vector
,或者将返回值存储在变量中

auto tokens = p->Tokens();
auto it = std::find_if( tokens.begin(), tokens.end(),
                        [&]( const Token & lhs )
                        {
                          return ( lhs == query );
                        });

作为@WhozCraig,可以进一步简化为

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++;
作为,
Tokens()
按值返回
std::vector
。这意味着下面的代码将比较两个不同的
向量
开始
结束
迭代器,这是未定义的行为

auto it = std::find_if( p->Tokens().begin(),p->Tokens().end(),
                        [&]( const Token & lhs )
                        {
                          return ( lhs == query );
                        });

要解决此问题,请修改
Tokens()
,使其通过引用返回
std::vector
,或者将返回值存储在变量中

auto tokens = p->Tokens();
auto it = std::find_if( tokens.begin(), tokens.end(),
                        [&]( const Token & lhs )
                        {
                          return ( lhs == query );
                        });

作为@WhozCraig,可以进一步简化为

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++;

我知道那种感觉,兄弟,这是错误的。这在任何方面都不需要一个好的异常。你可能在其他地方有未定义的行为。你能把这归结为一个问题吗?@Alex Is
Tokens()
按值返回
std::vector
?帮助慢家伙(我)
Tokens()
不返回引用吗?那太糟糕了。一旦你解决了这个问题,你也不需要用lambda查询这个问题。如果你只想找到一个匹配的人,你应该做你想做的事。我知道那种感觉,兄弟,那是错误的。这在任何方面都不需要一个好的异常。你可能在其他地方有未定义的行为。你能把这归结为一个问题吗?@Alex Is
Tokens()
按值返回
std::vector
?帮助慢家伙(我)
Tokens()
不返回引用吗?那太糟糕了。一旦你解决了这个问题,你也不需要用lambda查询这个问题。如果你只想找到一个匹配项,你应该做你想做的。为什么
p->tokens
而不仅仅是
tokens
?因为我没有注意。谢谢,这就解决了。我以前见过这种情况,但我承认我不明白为什么。非常感谢,因为这已经困扰了我好几次了。为什么
p->tokens
而不仅仅是
tokens
?因为我没有注意。谢谢,这就解决了。我以前见过这种情况,但我承认我不明白为什么。非常感谢,因为这已经困扰了我好几次了。