c++ - Valgrind:有条件的跳跃或移动取决于未初始化的值

标签 c++ valgrind

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/

相关文章:

c++ - 在 Qt Creator 中使用 'Analyze Memory' 工具

c - 内存泄漏 - C 中的单链表

c++ - 我什么时候应该在 Qt 上使用 qApp->setProperty

c++ - 为什么没有对成员函数指针的隐式转换

c++ - 将类代码分离为头文件和 cpp 文件

c++ - 高级 C++ 多括号

c++ - 重复宏 n 次

c - 类似 Getline 的函数崩溃

c++ - Char* 数组内存泄漏

c - 如何找出无效的地址是什么