2016-03-29 49 views
0

我认为删除的指针所指向的内存应该被零覆盖(不确定) 但它仍然指向int值10和相同的地址。这是怎么回事?删除的指针仍然指向旧的数据

int *p = new int; 
*p = 10; 
cout << *p << endl; //10 
cout << p << endl; //0x7fafc3c02e80  
delete p; 
cout << *p << endl; //10 
cout << &(*p) << endl; //0x7fafc3c02e80! 
return 0; 
+3

删除一个指针不会改变它指向的地址。它只是释放曾经分配过的内存,所以它可能会再次使用。另外,取消引用已删除的指针是未定义的行为。 – xinaiz

+1

你在一张纸上写下你的信用卡号码。你把它弄皱并扔进废纸篓。其他人拿出它,解开纸张,并读取您的信用卡号码。这是怎么回事? (这并不是一个完美的比喻,部分原因是在C++的情况下,通常甚至没有任何折中。) –

+1

删除指针意味着['内存对于动态内存的其他请求再次可用]。“(http:// www。 cplusplus.com/doc/tutorial/dynamic/)。 – tchelidze

回答

2

delete操作符释放指针指向的内存。一旦释放,它可以随时重新分配,因此访问该指针将产生不可预知的结果。在你的程序中,情况就是内存还没有被重新分配给其他任何东西。

https://msdn.microsoft.com/en-us/library/h6227113.aspx

具体来说:

“的对象上的使用删除操作员解除分配其内存解引用后的对象被删除可具有不可预测的结果或崩溃的指针的程序 当删除使用。为C++类对象释放内存时,在释放对象的内存之前调用对象的析构函数(如果对象具有析构函数)。“

1

您已返回分配给空闲堆池的空间。这并不意味着有些东西会写入零。这需要时间,你可能不想花那么多时间来完成这项任务。

我想有些类型可能会有销毁过程中可以清除其存储的析构函数,但int不会。

如果你想删除的数据,将其清除自己打电话delete

这也是一个不错的主意,继续使用内存,你已经告诉你用它做系统后前。

因此,您可以选择在delete之后将指针设置为NULL,如果您搞砸并尝试使用旧指针,将有助于引发异常。

0

您并未删除指针的实际value或其指向的值。你只是释放内存所以一些其他指针“稍后”将能够指向同一个地点。

+0

严格来说,指针甚至不需要指向同一个地方。释放的内存可以恰好在后续分配中使用。 – Downvoter

+0

@cad 100%正确。但不是像这样的noob问题 –

+0

noob问题需要简化,所以更不精确的抽象解释会更好。简单的不正确是有害的,尤其是,小白鼠。 – Downvoter