使用删除后指针是否指向堆栈或堆

Does a pointer point to the stack or heap after using delete?

本文关键字:堆栈 是否 删除 指针      更新时间:2023-10-16

在以下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) 后指向堆栈上的地址?

它仍然指向相同的地址(您可以通过打印地址来判断)。您有时会看到人们在释放内存后将NULLnullptr0分配给指针,以确保他们不会尝试取消引用释放的内存,因为它不会为他们分配 null。这允许他们拥有如下代码:

if (p != nullptr)
    //do something with p, it hasn't been freed and set to nullptr

如果在释放时未将其设置为 null,则很难做到这一点,但请注意,智能指针为上述指针提供了更安全、更一致的替代方案。

获得正确输出的原因是未定义的行为。它可能会崩溃,可能会爆炸,或者它可以工作。我想它选择了工作。

删除p向管理内存(操作系统)的人发出信号,表明底层空间现在可以由其他人自由重新分配供自己使用。 但是,p仍然指向相同的内存位置,并且可以取消引用以获取该内存中内容的值 - 请注意,由于该内存现在可能由其他人使用,因此底层位可能与以前不同。

是的,它仍然指向堆,但内存位置不稳定。 操作系统可以随时回收它,因此不能保证该内存位置的值是您设置的值。

此外,据

我所知,所有动态内存分配都发生在堆上,而不是堆栈上。 堆栈是为参数和局部变量保留的。