问题描述
请查看下面的代码:
#include<iostream>
using namespace std;
int main()
{
int *ptr;
ptr = new int[100000];
cout<<"\n\n address = "<<ptr;
for(long int i=0;i<100000;i++)
*(ptr+i) = i+1;
delete []ptr;
cout<<"\n\n address = "<<ptr;
ptr = new int[5];
cout<<"\n\n address = "<<ptr;
return 0;
}
输出是:
address = 0xd42490
address = 0xd42490
address = 0xe919d0
为什么在delete []ptr;
之后,它仍然指向其先前的位置(请参见第二个输出)。
解决方法
delete[]
正常工作。这样可以确保为数组的成员调用析构函数,并将内存(内部)标记为可重用。
C ++标准中没有什么,其中说它必须将内存清零或将内存返回给OS或清除包含传递给它的地址的变量,等等。
一旦delete
,您就知道析构函数已经运行,并且您也知道不再允许您查看(访问)该内存。无论如何,都无法保证会得到什么(UB除外)。
一个指针就像一个硬纸板标志,上面写着“那边有东西”。当您在指针上使用delete
时,它会破坏“在那儿”的内容,但不会重写符号本身(指针),因此指针仍然指向它始终执行的相同内存位置,但是现在禁止访问该内存位置。
delete []
破坏了在地址ptr
动态创建的数组,但没有删除指针本身。
ptr = nullptr;
命令将执行该工作,方法是指示ptr
现在什么也没有指向。