我目前正在编写一些C++代码,它会执行大量的文本分析。在检查char是否为可见字符(而不是空格)之后,一个功能会将字符推入字符串中。然而,当我运行下面的代码:函数返回时的神秘分段错误,无指针或涉及分配
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("");
}
}
它调用下面的代码块:
bool myChar::isWS(char c){ // returns true if char is whitespace
std::cout<< "comparing" <<std::endl;
if((c >= '!') && (c <= '~')){
std::cout<< "compared" <<std::endl;
return false;
}
else {
std::cout<< "compared" <<std::endl;
return true;
}
}
当这些功能的运行,我(有时)获得分割故障后,立即“比较”是由myChar :: isWS()打印。我的代码中没有指针/解除引用(尽管我假设C++实现了一些指向幕后的STL容器),并且除了返回调用之外,当时没有内存访问。我跑了Valgrind的代码,它告诉我有一个无效的内存访问发生。
什么类型的东西可能会导致这种问题没有指针/解除引用?有什么方法可以用该代码破坏堆栈?
非常感谢您的帮助。
你可以显示*确切* Valgrind消息? – 2014-12-08 00:12:17
在pushChar的第6行上,你只是引用了列表myList.back()的后面,它将在一个空列表上分割错误。你有意在这里使用push_back吗?这条线不会做任何其他事情。 – 2014-12-08 00:45:36
@EmployedRussian,Valgrind返回以下结果: 无效的读取大小为8 ,位于0x4EF0860:std :: string :: size()const(位于/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19中) by 0x40291B:myWords :: pushChar(char)(marcstr.cpp:70) – mwarrior 2014-12-08 01:05:14