int* g () {
int j = 2;
return &j;
}
int main () {
using namespace std;
int v = *g();
// assert(v == 2); // Valgrind: Conditional jump or move depends on uninitialised value(s)
}
因此,该断言会导致 Valgrind 错误,但我不太确定该错误的含义,以及为什么不允许我对该语句调用断言。
'v' 在断言之前已经初始化,那么为什么会导致该错误?
提前致谢。
最佳答案
j
已初始化,但一旦依赖它具有任何特定值变得非法,它就变得有效地未初始化,这发生在它超出范围时。
这段代码返回了一个指向j
的指针:
int* g () {
int j = 2;
return &j;}
此代码取消引用该指针:
int v = *g();
但是 j
不再存在——当 g
返回时它超出了范围。您不能取消引用指向不再存在的变量的指针。
关于c++ - Valgrind:有条件的跳跃或移动取决于未初始化的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17735750/