问题描述
两者有什么区别
{p = NULL ;}
和
{Delete p; }
当我执行这段代码时:
int *p ;
p = new int;
* p = 4;
cout << *p; // = 4
delete p ;
cout << *p; //
在最后一行中,我希望得到一个垃圾值,因为指针不再指向同一个位置,对吗?但相反,我得到了相同的值,即 4,这怎么可能?
解决方法
p = NULL;
只是将 p
设置为 NULL,但对 p
指向的内存没有任何作用。
delete p;
释放 p
指向的内存,前提是该内存是用 new
分配的(如您的示例中所示)。
在您的示例中,在调用 *p
后尝试访问 delete p;
是未定义行为,因此任何事情都可能发生。 p
仍然指向与之前相同的地址,delete
不会以任何方式改变 p
本身,但是 p
指向的内存不再有效.您碰巧看到存储在该内存中的旧数据,但这仅仅是因为它尚未被覆盖。但是仍然不允许以任何理由访问无效内存。实际内存仍由底层内存管理器物理分配,但逻辑对于您的代码是不可访问的,直到它再次重新分配。