函数返回时出现神秘的分段错误,不涉及指针或分配 我目前正在编写一些C++代码来进行大量的文本解析。一个特性是在检查字符是否为可见字符(与空白相反)后将字符推入字符串。但是,当我运行下面的代码时: void myWords::pushChar(char c){ myChar cc; std::cout<< "before if" <<std::endl; if(!(cc.isWS(c))){ std::cout<< "after if" <<std::endl; myList.back(); } else if((myList.back()).size()>0){ myList.push_back(""); } } void myWords::pushChar(char c){ myChar-cc; std::cout

函数返回时出现神秘的分段错误,不涉及指针或分配 我目前正在编写一些C++代码来进行大量的文本解析。一个特性是在检查字符是否为可见字符(与空白相反)后将字符推入字符串。但是,当我运行下面的代码时: void myWords::pushChar(char c){ myChar cc; std::cout<< "before if" <<std::endl; if(!(cc.isWS(c))){ std::cout<< "after if" <<std::endl; myList.back(); } else if((myList.back()).size()>0){ myList.push_back(""); } } void myWords::pushChar(char c){ myChar-cc; std::cout,c++,memory,memory-leaks,segmentation-fault,return,C++,Memory,Memory Leaks,Segmentation Fault,Return,您的错误看起来像是在调用空列表时返回的不存在对象的大小。例如,在第二条if语句中。在安全使用back()之前,您需要检查空列表 我猜你想要这样的东西 void myWords::pushChar(char c) { if( !isWhitespace (c) ) { myList.push_back(c); } else { if( !myList.empty() && (myList.back().siz

您的错误看起来像是在调用空列表时返回的不存在对象的大小。例如,在第二条if语句中。在安全使用back()之前,您需要检查空列表

我猜你想要这样的东西

void myWords::pushChar(char c)
{ 
    if( !isWhitespace (c) )
    {
        myList.push_back(c);
    }
    else 
    {
       if( !myList.empty() && (myList.back().size()>0) ) // is last element a non-empty string ?
       {
         myList.push_back("");  // then push an empty string on to list
       }
    }
 }

了解myList是如何声明的以及pushChar中的预期逻辑是什么将很有帮助。

您可以显示确切的Valgrind消息吗?在pushChar的第6行,您只是引用列表myList.back()的后面这将在一个空列表上区分错误。您是想在这里使用push_吗?该行没有其他功能。@EmployedRussian,Valgrind返回以下内容:0x4EF0860处大小为8的无效读取:std::string::size()const(in/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)乘以0x40291B:myWords::pushChar(char)(marcstr.cpp:70)@DavidWoo,是的,我最初有myList.back()。在那里向后推(c),但我开始从那一行中删除内容(一次删除一个),以查看是否有任何内容导致了错误。segfault位于“if”之后可以打印。您的错误看起来像是在调用空列表时返回的不存在对象的大小。例如,在第二条if语句中。您需要先检查空列表,然后才能安全地使用back()。myList是字符串向量,我想执行myList.back()。push_back(c)。您(上面)关于使用back()的评论在一个空向量上是问题所在。
void myWords::pushChar(char c)
{ 
    if( !isWhitespace (c) )
    {
        myList.push_back(c);
    }
    else 
    {
       if( !myList.empty() && (myList.back().size()>0) ) // is last element a non-empty string ?
       {
         myList.push_back("");  // then push an empty string on to list
       }
    }
 }