2012-10-17 87 views
2

在C++代码这些行:使用delete之后,指针是否指向堆栈或堆?

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

“输出是23”:你的意思是“13”,对吧? – 0x499602D2

+0

是的,谢谢你的追捕 – imkendal

回答

5

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

8

It still points to the same address(你可以通过打印地址来判断)。在释放内存后,您有时会看到人们将NULLnullptr0指定给指针,以确保它们不尝试解除引用释放的内存,因为它没有为它们分配空值。这让他们有如下代码:

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

这是很难做到的,如果当它被释放,那么它不是设置为空,但注意,智能指针提供了一个更安全,更一致的替代上述。

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

1

是的,它仍然指向堆但内存位置不稳定。操作系统可以随时回收它,因此该内存位置的值不保证是您设置的值。另外,据我所知,所有动态内存分配都发生在堆上,而不是堆栈上。堆栈保留用于参数和局部变量。