解释valgrind错误

Interpreting valgrind error

本文关键字:错误 valgrind 解释      更新时间:2023-10-16

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

Conditional jump or move depends on uninitialised value(s)

Invalid read of size 8

我主要关心的是第一个问题,如果值真的没有初始化,我相信会出现分段错误。我通过向另一个函数发送相同的指针,同时向我知道会引发分段错误的函数发送未初始化的指针来测试这一点,只有真正未初始化的指示器才会导致分段错误。

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

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

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

a.cp

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("%fn",t);
}
Conditional jump or move depends on uninitialised value(s)

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

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

应该做到这一点。无法对未初始化的变量进行比较/打印或执行某些操作。

Invalid read of size 8

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

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

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

"大小X"通常是你试图读取的内存量,所以大小8意味着你试图读取8个字节。

希望能有所帮助。如果需要调试帮助,请发布更具体的代码。Valgrind通常会告诉错误发生的位置,这样您就可以知道该怎么做了。