解释valgrind错误

时间:2011-08-01 13:35:10

标签: c++ debugging valgrind

我正在尝试使用valgrind调试我的代码。我收到的大部分信息都是:

Conditional jump or move depends on uninitialised value(s)

Invalid read of size 8

我主要关注的是第一个,如果该值真的未初始化,我相信会发生分段错误。我通过向另一个函数发送相同的指针以及指向函数的未初始化指针来测试这个,我知道这个函数会引发分段错误,只有真正未初始化的指针才会导致分段错误。

此错误消息的含义也可能是什么。

此外,第二个错误是什么意思?

EDIT1
这是一个模型代码,会给出错误1(假设头文件合法)?

a.cpp

B b;
C c;
int main(){
  return 0;
}

B.cpp

extern C c;
//    double t; //canceld, declared in the header.
B::B(){
  this->t = 1;
  c.test(t);
}
B::test(){
  c.test(this->t);
}

B.cpp

C::C(){
}

C::test(double t){
  printf("%f\n",t);
}

1 个答案:

答案 0 :(得分:5)

Conditional jump or move depends on uninitialised value(s)

这意味着您正在尝试对未初始化的变量执行某些操作。例如:

int main()
{
    int x;
    if (x == 5)
        printf("%d\n", x);
    return 0;
}

应该做的伎俩。您无法比较/打印或对未初始化的变量执行某些操作。

Invalid read of size 8

这意味着您正在尝试从不存在的内存中读取,即尚未分配。

int main()
{
    char* x = malloc(10);
    x[10] = '@';    //this is an invalid write
    printf("%c\n", x[10]); //this is an invalid read
    return 0;
}

会导致错误,因为你只为10个字符分配了空间,但是你正在写第11个字符(请记住,数组是0索引的,因此你只能写入0-9)。

“大小X”通常是您尝试读取的内存量,因此大小8表示您尝试读取8个字节。

希望它有所帮助。如果您需要调试帮助,请发布更具体的代码。 Valgrind通常会告诉您错误发生的位置,以便您可以找出要做的事情。