C++ 为什么c++;变量不能立即删除?
我想知道为什么从函数返回时指向的数据不会立即删除。在下面的代码片段中,我希望当我将x的地址返回到指针以在从函数返回时对其进行初始化时,存储在x地址中的数据应该立即删除。然而,我仍然能够在main中获得正确的值,只有在多行代码之后,它才会突然变成垃圾?为什么不立即发生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
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是否真的捕捉到了错误)
当您返回局部变量的地址时,结果
指针“悬挂”;通过悬挂的指针访问,甚至
只是阅读它,是未定义的行为。这意味着
理论上,任何事情都可能发生。实际上,编译后的代码
不会返回函数中局部变量的内存
对于操作系统来说,在大多数操作系统中,即使它愿意,它也做不到
记忆就在那里,直到有人离开