【问题标题】:Does a pointer point to the stack or heap after using delete?使用delete后指针是否指向堆栈或堆?
【发布时间】:2012-10-07 04:13:08
【问题描述】:

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

【问题讨论】:

  • “输出是 23”:你的意思是“13”,对吧?
  • 是的,感谢您的关注

标签: c++ memory-leaks heap-memory stack-memory


【解决方案1】:

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,这很难做到,但请注意,智能指针提供了比上述更安全、一致的替代方案。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-13
        • 2020-03-09
        • 2013-01-20
        • 1970-01-01
        • 2011-03-14
        • 2019-01-15
        相关资源
        最近更新 更多