解释valgrind错误

Yot*_*tam 5 c++ debugging valgrind

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

Conditional jump or move depends on uninitialised value(s)
Run Code Online (Sandbox Code Playgroud)

要么

Invalid read of size 8
Run Code Online (Sandbox Code Playgroud)

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

这个错误消息的含义也可能是什么.

另外,第二个错误意味着什么?

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

a.cpp

B b;
C c;
int main(){
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

B.cpp

C::C(){
}

C::test(double t){
  printf("%f\n",t);
}
Run Code Online (Sandbox Code Playgroud)

Bla*_*ack 5

Conditional jump or move depends on uninitialised value(s)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Invalid read of size 8
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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