0
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' 在断言之前已经被初始化,那么为什么会导致这个错误呢?

先感谢您。

4

1 回答 1

4

j已初始化,但一旦依赖它具有任何特定值变得非法,就会有效地未初始化,这在它超出范围时发生。

此代码返回一个指向j

int* g () {
    int j = 2;
    return &j;}

此代码取消引用该指针:

int v = *g();

j不再存在——它在g返回时超出了范围。您不能取消引用指向不再存在的变量的指针。

于 2013-07-18T23:35:07.603 回答