为什么 c++ 变量没有立即被移除
Why does the c++ variable not get detleted immediately?
我想知道为什么从函数返回时指向的数据没有立即删除。在下面的代码片段中,我希望当我从函数返回时将 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这样的程序可能会检查指针是否有效,并记录错误(但我不知道瓦尔格林德是否真的捕获了这)。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 通过多个头文件使用常量变量
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 执行函数时导致崩溃的变量
- 变量没有改变?通过向量的函数调用