使用删除后,指针是指向堆栈还是堆?

时间:2012-10-17 00:04:19

标签: c++ memory-leaks stack heap

在这些C ++代码行中:

int * p = new int(33);
delete(p);
*p = 13;
cout << *p << endl;

输出为13;

P最初指向堆上的地址,然后我使用delete关键字取消分配p的已分配内存地址,但仍然可以为内存地址分配值23;这是p在“int * p = new int(33)”之后指向的堆上的相同地址,还是在使用delete(p)后p指向堆栈上的地址?

3 个答案:

答案 0 :(得分:8)

It still points to the same address(你可以通过打印地址告诉)。在释放内存后,您有时会看到人们将NULLnullptr0分配给指针,以确保他们不会尝试取消引用已释放的内存,因为它不会为他们分配null。这允许他们拥有如下代码:

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

如果在释放时没有将其设置为null,则很难做到,但请注意智能指针提供了更安全,更一致的替代方法。

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

答案 1 :(得分:5)

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

答案 2 :(得分:1)

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

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