C++:删除动态变量

问题描述

两者有什么区别

{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 指向的内存不再有效.您碰巧看到存储在该内存中的旧数据,但这仅仅是因为它尚未被覆盖。但是仍然不允许以任何理由访问无效内存。实际内存仍由底层内存管理器物理分配,但逻辑对于您的代码是不可访问的,直到它再次重新分配。