使用删除后指针是否指向堆栈或堆
Does a pointer point to the stack or heap after using delete?
在以下C++代码行中:
int * p = new int(33);
delete(p);
*p = 13;
cout << *p << endl;
输出为 13;
P 最初指向堆上的一个地址,然后我使用 delete 关键字来释放 p 分配的内存地址,但仍然可以为内存地址分配值 23;这是堆上 p 在 "int * p = new int(33)" 之后指向的地址,还是 p 在使用 delete(p) 后指向堆栈上的地址?
它仍然指向相同的地址(您可以通过打印地址来判断)。您有时会看到人们在释放内存后将NULL
或nullptr
或0
分配给指针,以确保他们不会尝试取消引用释放的内存,因为它不会为他们分配 null。这允许他们拥有如下代码:
if (p != nullptr)
//do something with p, it hasn't been freed and set to nullptr
如果在释放时未将其设置为 null,则很难做到这一点,但请注意,智能指针为上述指针提供了更安全、更一致的替代方案。
获得正确输出的原因是未定义的行为。它可能会崩溃,可能会爆炸,或者它可以工作。我想它选择了工作。
删除p
向管理内存(操作系统)的人发出信号,表明底层空间现在可以由其他人自由重新分配供自己使用。 但是,p
仍然指向相同的内存位置,并且可以取消引用以获取该内存中内容的值 - 请注意,由于该内存现在可能由其他人使用,因此底层位可能与以前不同。
是的,它仍然指向堆,但内存位置不稳定。 操作系统可以随时回收它,因此不能保证该内存位置的值是您设置的值。
此外,据我所知,所有动态内存分配都发生在堆上,而不是堆栈上。 堆栈是为参数和局部变量保留的。
相关文章:
- 堆栈和队列是否像C++中的数组一样传递?
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 如果我们通过引用传递变量,则递归中使用的堆栈空间量是否为零?
- 是否可以检查悬挂光纤的调用堆栈?
- "new"创建的实例的所有成员变量是否都存在于堆上而不是堆栈上?
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 是否可以访问代码中的调用堆栈?
- 堆栈变量超出范围时是否解除分配?
- 唯一指针是否在堆或堆栈上分配内存?
- C++,在对象内分配多个数据时,堆栈分配是否更有效? 在下面的程序中,类A_Heap的效率会更低吗?
- 对象向量是否在堆或堆栈上分配C++?
- 有什么方法可以检测我的类的对象是否在堆栈上创建
- 是否可以检查存储在堆栈上的单词是否是回文,而C++中没有任何附加数据结构
- 虚拟功能是否不太可能导致堆栈溢出
- 在我的实现中使用堆栈是否正确?
- std :: vector用作堆栈和std :: stack之间是否存在任何复杂性差异
- 查看使用堆栈是否相等的两个字符串
- 如何在C++中检查两个堆栈是否相同
- 如果 EBP 帧指针为 NULL,堆栈是否损坏
- 如何检查堆栈是否损坏