为什么不立即删除c ++变量?

时间:2014-11-12 12:13:53

标签: c++ pointers garbage

我想知道为什么从函数返回时指向的数据不会立即删除。在下面的代码片段中,我希望当我从函数返回时将x的地址返回到指针以初始化它时,应立即删除存储在x地址中的数据。但是我仍然能够在main中获得正确的值,然后只有在一行代码突然变成垃圾之后?为什么这不会立即发生

int* function(int x)
{
    cout << x << endl; // This outputs 5 as expected
    return &x;
}

int main()
{
    int* a = function(5);


    cout << *a; // This still outputs 5. Why?
    cout << endl;

    cout << *a; // It is garbage here as expected
    cout << endl;

    return 0;
}

由于

4 个答案:

答案 0 :(得分:2)

返回局部变量的地址会调用未定义的行为。所以,你很幸运。

局部变量(在堆栈上分配)在离开它的范围时被删除,在你的情况下是function()结束时。但是,在变量离开作用域后,它占用的内存不会立即重写,除非重用该内存,x的值将保留在那里。

由于它调用UB,您尝试读取该内存的内容可能会导致读取正确的值,读取垃圾,程序崩溃或其他任何内容。

答案 1 :(得分:1)

未定义局部变量的返回地址。未定义意味着您无法预测它是否会输出正确或不正确的结果。不幸的是你得到了正确的结果。

答案 2 :(得分:0)

因为你不应该访问这样的&#34;垃圾&#34; (技术术语),系统可以根据需要自由处理。例如,可能还有其他任务的完成 影响了正确编写的程序。

答案 3 :(得分:0)

当您返回局部变量的地址时,结果 指针“悬挂”;通过悬空指针访问,甚至是 只是阅读它,是未定义的行为。这意味着在 理论,一切都可能发生。在实践中,编译代码 不会返回函数中局部变量的内存 到操作系统;在大多数操作系统中,即使它想要它也无法实现。所以 记忆只是坐在那里,直到其他人使用它。在里面 在函数中存储的情况下,它会在您调用时重用 另一个功能;在那之前,你可能会 访问它并找到旧值。调试构建可能 在离开函数时有意乱写内存, 但主流编译器不这样做。而且当然, 像valgrind 这样的程序可能检查指针是否有效, 并记录错误(但我不知道valgrind是否实际捕获 这一点)。