C ++中的delete []运算符无法正常工作

问题描述

请查看下面的代码

    #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现在什么也没有指向。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...