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

C++ 为什么c++;变量不能立即删除?,c++,pointers,garbage,C++,Pointers,Garbage,我想知道为什么从函数返回时指向的数据不会立即删除。在下面的代码片段中,我希望当我将x的地址返回到指针以在从函数返回时对其进行初始化时,存储在x地址中的数据应该立即删除。然而,我仍然能够在main中获得正确的值,只有在多行代码之后,它才会突然变成垃圾?为什么不立即发生 int* function(int x) { cout << x << endl; // This outputs 5 as expected return &x; } int ma

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

cout返回局部变量的地址会调用未定义的行为。因此,您很幸运

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


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

返回局部变量的地址会调用未定义的行为。因此,您很幸运

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


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

返回局部变量的地址会调用未定义的行为。因此,您很幸运

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


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

返回局部变量的地址会调用未定义的行为。因此,您很幸运

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


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

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

局部变量的返回地址未定义。未定义表示您无法预测它将输出正确或不正确的结果。不幸的是,您得到了正确的结果。

局部变量的返回地址未定义。未定义表示您无法预测它将输出正确或不正确的结果。这是u假设您得到了正确的结果。

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

因为您不应该访问此类“垃圾”(技术术语),系统可以随意处理它。例如,可能有其他任务的完成会影响正确编写的程序。

因为您不应该访问此类“垃圾”(技术术语),系统可以随意处理它。例如,可能有其他任务的完成会影响正确编写的程序。

因为您不应该访问此类“垃圾”(技术术语),系统可以随意处理它。例如,可能有其他任务的完成会影响正确编写的程序。

因为您不应该访问此类“垃圾”(技术术语),系统可以随意处理它。例如,可能有其他任务的完成会影响正确编写的程序。

当您返回局部变量的地址时,结果 指针“悬挂”;通过悬挂的指针访问,甚至 只是阅读它,是未定义的行为。这意味着 理论上,任何事情都可能发生。实际上,编译后的代码 不会返回函数中局部变量的内存 对于操作系统来说,在大多数操作系统中,即使它愿意,它也做不到 记忆就在那里,直到有人使用它 如果函数中有内存,则在调用 另一个功能;在此之前,您可能能够 访问它并查找旧值。调试生成可能会 离开函数时故意在内存上涂鸦, 但主流编译器不这么做。当然, valgrind等程序可能会检查指针是否有效, 并记录一个错误(但我不知道valgrind是否真的捕捉到了错误)
当您返回局部变量的地址时,结果 指针“悬挂”;通过悬挂的指针访问,甚至 只是阅读它,是未定义的行为。这意味着 理论上,任何事情都可能发生。实际上,编译后的代码 不会返回函数中局部变量的内存 对于操作系统来说,在大多数操作系统中,即使它愿意,它也做不到 记忆就在那里,直到有人离开