内存管理问题
memory management question
可能重复:
可以使用局部变量';内存是否在其范围之外被访问?
我有以下关于记忆管理的问题,我读这篇文章的来源说,当变量超出范围时,该内存将不再保证存储变量的值示例代码给出
int main() {
int *p;
if (true) {
int x = 5;
p = &x;
}
cout << *p << endl; // ???
}
它还说这里,p已成为一个悬空指针(指向内容未定义的内存(但是这个代码给我显示了结果5。所以写这样的代码是错误的吗?请向我解释
关键短语"不再保证"。行为是未定义的。它可能工作,也可能不工作,这取决于你的编译器决定做什么
你不能依赖这种行为。所以你永远不应该写这样的代码。
删除对象时,用于存储该对象的内存范围将被释放。这只意味着其他进程现在可以自由使用这个内存范围。存储在那里的值将保持不变,直到被另一个进程重写为止。
这相当类似于在windows中"删除"某些内容。你实际做的是告诉系统,你允许它将这个空间用于其他事情。如果你试图立即恢复文件,那么很有可能还没有其他内容写入你的硬盘。如果你等了几天,那么很有可能会有另一个文件被写在上面
因此,挂起指针不能保证返回最初存储在那里的值。
我认为这是因为。。p持有的地址在本地作用域中仍然具有地址x的值,但编译器现在可以自由分配该空间。所以这种行为是完全没有定义的。
在此块之后:
if (true) {
int x = 5;
p = &x;
}
变量x
是从堆栈中展开的,所以它占用的内存可以自由重用。而且它可以在任何时候重复使用。
您的代码会留下一个不再存在的变量的地址。C++标准没有声明内存会发生什么。取消引用指针将产生未定义的行为。
不幸的是,UB展示自身的一种方式是让代码看起来正常工作。
在}
之后,x
变量内存将释放,您将使用}
之外的内存。
相关文章:
- 字符 * 未从重载运算符或内存管理问题正确返回
- Waveshare 电子纸 ESP32 板上的 HTTP 客户端管理问题
- c++中的内存管理问题
- C++堆栈内存管理问题
- C 内存管理问题,std :: vector nevere rase内存超出范围
- MPI 新手 - 关于'mpirun'如何工作和流程管理的一些问题
- 内存管理策略的问题
- C++中的复杂内存管理问题
- 有关资源管理器类的 RAII 问题
- CUDA 内存管理/类问题中的指针
- 执行命令行管理程序命令时出现性能问题
- 在 Qt5.3(mingw32) 中删除 QQuickView 的内存管理问题
- C++内存管理问题(分配大量内存,但从不释放内存)
- 内存管理容器设计问题 - 项目需要继承
- C++中管理内存泄漏的问题
- c++内存管理.这段代码有什么问题?
- 在头文件中存储代码会导致c++中的内存管理问题吗?
- 关于内存管理、堆栈和堆的问题
- 内存管理问题
- 涉及类析构函数和删除运算符的一些内存管理问题