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

imk*_*dal 2 c++ heap stack memory-leaks

在这些C++代码行中:

int * p = new int(33);
delete(p);
*p = 13;
cout << *p << endl;
Run Code Online (Sandbox Code Playgroud)

输出为13;

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

chr*_*ris 8

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

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

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

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


nic*_*hev 5

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