2014-12-07 63 views
1

我目前正在编写一些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的代码,它告诉我有一个无效的内存访问发生。

什么类型的东西可能会导致这种问题没有指针/解除引用?有什么方法可以用该代码破坏堆栈?

非常感谢您的帮助。

+0

你可以显示*确切* Valgrind消息? – 2014-12-08 00:12:17

+0

在pushChar的第6行上,你只是引用了列表myList.back()的后面,它将在一个空列表上分割错误。你有意在这里使用push_back吗?这条线不会做任何其他事情。 – 2014-12-08 00:45:36

+0

@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

回答

0

当你有一个空列表时,你的错误看起来像你正在调用不存在的对象上的大小。即在第二个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。

+0

myList是一个字符串的向量,我想做myList.back()。push_back(c)。您对上面关于在空向量上使用back()的评论是个问题。 – mwarrior 2014-12-08 01:24:09