为什么 c++ 变量没有立即被移除

Why does the c++ variable not get detleted immediately?

本文关键字:c++ 变量 为什么      更新时间:2023-10-16

我想知道为什么从函数返回时指向的数据没有立即删除。在下面的代码片段中,我希望当我从函数返回时将 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;
}

谢谢

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

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

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

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

由于您不应该访问此类"垃圾"(技术术语),因此系统可以自由地处理它认为合适的内容。 例如,可能还有其他任务的完成会影响正确编写的程序。

返回局部变量的地址时,结果指针"晃来晃去";通过悬空的指针访问,甚至只是阅读它,是未定义的行为。 这意味着在理论上,任何事情都可能发生。 在实践中,编译后的代码不会返回函数中局部变量的内存到操作系统;在大多数操作系统中,即使它愿意,它也不能。 所以记忆只是坐在那里,直到其他人使用它。 在函数中的内存大小写,调用时会重用另一个功能;在那之前,您可能能够访问它并找到旧值。 调试构建可能会离开函数时故意在内存上涂鸦,但主流编译器不会这样做。 当然,像Valgrind这样的程序可能会检查指针是否有效,并记录错误(但我不知道瓦尔格林德是否真的捕获了这)。