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 现在指向任何内容。