【发布时间】:2011-08-01 13:35:10
【问题描述】:
我正在尝试使用 valgrind 调试我的代码。我收到的大部分信息是:
Conditional jump or move depends on uninitialised value(s)
或
Invalid read of size 8
我主要关心第一个,如果该值确实未初始化,我相信会发生分段错误。我通过向另一个函数发送相同的指针以及指向我知道会引发分段错误的函数的未初始化指针来测试这一点,并且只有真正未初始化的指针会导致分段错误。
此错误消息的含义也可能是什么。
另外,第二个错误是什么意思?
编辑1
这是一个模型代码,会不会给出错误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);
}
【问题讨论】:
-
valgrind 是否指向特定的代码行?查看它标记的代码的一些示例会很有帮助。第一个可能不一定与指针有关,但可以是您未初始化但随后在条件语句中使用的任何变量。
-
我对 valgrind 的体验是“当它指示错误而我看不到它时”我只是误读了错误和/或代码,而 valgrind 实际上是正确的。
-
@unluddite,是的。在我把它放入我的代码之前,是否有可能给出这条消息,因为我在传递的指针上使用的函数实际上属于一个在我调用函数后初始化的类? (我在我的问题中放了一个模型伪代码)
-
@Mark B,这对应于我的编辑和评论。我的问题是如何理解这些错误。
-
@Yotam - 如果您从 B 的构造函数中调用
test(),那将是一个问题。否则听起来更像是你有一个if (x > 5),而x没有价值。那不会有段错误。