这个Valgrind错误的原因是什么?

时间:2011-09-22 03:44:47

标签: c++ string valgrind

Valgrind抱怨一个substr调用。

string Message::nextField(string& input) {
    int posSeparator = input.find_first_of(SEPARATOR);
    string temp;
    temp = input.substr(0, posSeparator); //Error points to this line
    input.erase(0, posSeparator + 1);
    return temp;
}

错误如下:
12个块中的290个字节肯定在1的丢失记录1中丢失 该函数的作用基本上是解析输入,返回由SEPARATOR字符分隔的字符串部分。使用下一个定义从另一个类的方法调用此函数:

void doSomething(string input) {
    input.erase(0,2);
    string temp = nextField(input);
    this->room = atoi(temp.c_str());
    temp = input;
    this->money = atoi(temp.c_str());
}

没有别的奇怪或重要的东西可以包含在这里。 我使用Eclipse Indigo的Valgrind分析中的Valgrind的默认设置。 有什么想法吗?

3 个答案:

答案 0 :(得分:2)

这可能不是您代码中的错误。由于C ++标准库的实现细节,可能会报告此错误。要验证此操作,请尝试Valgrind FAQ中的以下内容:

  

使用GCC 2.91,2.95,3.0和3.1,使用STL编译所有源   使用-D__USE_MALLOC。谨防!这是从GCC开始删除的   版本3.3。

     

使用GCC 3.2.2及更高版本,您应该导出环境变量   运行程序前的GLIBCPP_FORCE_NEW。

     

使用GCC 3.4及更高版本,该变量已将名称更改为   GLIBCXX_FORCE_NEW。

答案 1 :(得分:1)

您的来源中的其他位置可能有错误。我尝试使用以下代码复制错误:

#include <string>
#include <iostream>
#include <cstdlib>

using namespace std;

const char SEPARATOR = ':';

struct Foo
{
public:
    int room;
    int money;

    void doSomething(string input) {
        input.erase(0,2);
        string temp = nextField(input);
        this->room = atoi(temp.c_str());
        temp = input;
        this->money = atoi(temp.c_str());
    }

    string nextField(string& input) {
        int posSeparator = input.find_first_of(SEPARATOR);
        string temp;
        temp = input.substr(0, posSeparator); //Error points to this line
        input.erase(0, posSeparator + 1);
        return temp;
    }
};

int main()
{
    Foo f;
    f.doSomething("--234:12");
    std::cout << f.room << " - " << f.money << std::endl;
}

然后跑了valgrind:

valgrind --tool=memcheck <executable>

,输出结果为:

HEAP SUMMARY:
    in use at exit: 0 bytes in 0 blocks
  total heap usage: 2 allocs, 2 frees, 61 bytes allocated

All heap blocks were freed -- no leaks are possible

For counts of detected and suppressed errors, rerun with: -v
ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)

所以,可能你的问题不在这段代码中

答案 2 :(得分:0)

您不检查posSeparator是否与string :: npos实际不同 - 这可能会导致擦除问题。这是一个疯狂的镜头,但无论如何它可能会修复一个bug。