C++ 中的 delete[] 运算符无法正常工作
delete[] operator in C++ not working as it should
请看下面的代码::
#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[]
正常工作。它确保为数组成员调用析构函数并将内存(内部)标记为可用于 re-use.
C++ 标准中没有任何内容 说它必须将内存清零或 return 内存到 OS 或清除保存变量的变量您传递给它的地址等
一旦你 delete
一些东西,你就知道析构函数有 运行 并且你也知道你 不再被允许查看(访问)那个内存.如果您这样做了,则无法保证您会得到什么(UB 除外)。
指针就像一个纸板标志,上面写着“那里有东西”。当您在指针上使用 delete
时,它会破坏“那边”的内容,但它不会 re-write 符号本身(指针),因此指针仍然指向它始终指向的相同内存位置,但现在禁止访问该内存位置。
delete []
已销毁在地址 ptr
处动态创建的数组,但尚未删除指针本身。
ptr = nullptr;
命令将执行该工作,方法是指示 ptr
现在指向任何内容。
请看下面的代码::
#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[]
正常工作。它确保为数组成员调用析构函数并将内存(内部)标记为可用于 re-use.
C++ 标准中没有任何内容 说它必须将内存清零或 return 内存到 OS 或清除保存变量的变量您传递给它的地址等
一旦你 delete
一些东西,你就知道析构函数有 运行 并且你也知道你 不再被允许查看(访问)那个内存.如果您这样做了,则无法保证您会得到什么(UB 除外)。
指针就像一个纸板标志,上面写着“那里有东西”。当您在指针上使用 delete
时,它会破坏“那边”的内容,但它不会 re-write 符号本身(指针),因此指针仍然指向它始终指向的相同内存位置,但现在禁止访问该内存位置。
delete []
已销毁在地址 ptr
处动态创建的数组,但尚未删除指针本身。
ptr = nullptr;
命令将执行该工作,方法是指示 ptr
现在指向任何内容。