C++ 在2D数组中释放内存

C++ 在2D数组中释放内存,c++,arrays,pointers,dynamic-allocation,C++,Arrays,Pointers,Dynamic Allocation,假设我们有: int** myArray = new int*[100]; for(int i = 0; i < 100; i++){ myArray[i] = new int[3]; } 二, for(int i=0;i

假设我们有:

int** myArray = new int*[100];
for(int i = 0; i < 100; i++){
    myArray[i] = new int[3];
}
二,

for(int i=0;i<100;i++){
对于(int j=0;j<3;j++){
删除myArray[i][j];
}
}
删除[]myArray;
从直觉上看,我们似乎应该做类似于2的事情。由于我们希望删除分配的所有内存,但我不确定。

正确的方法是

for(int i = 0; i < 100; i++)
   delete [] myArray[i];

delete [] myArray;
for(int i=0;i<100;i++)
删除[]myArray[i];
删除[]myArray;

您使用了一个循环来创建它,您应该使用一个循环来删除它。顺序与分配顺序相反:

for(int i = 0; i < 100; i++)
    delete [] myArray[i];              // delete all "rows" in every "column"

delete [] myArray;                     // delete all "columns"
for(int i=0;i<100;i++)
删除[]myArray[i];//删除每个“列”中的所有“行”
删除[]myArray;//删除所有“列”
此外:

  • 用于删除一维动态分配数组-用于删除上面的“行”和“列”

  • 仅类似于删除2D指针数组的方式,例如:

    int*** myArray = new int**[100];   // (1)
    
    for(int i = 0; i < 100; i++)
    {
        myArray[i] = new int*[3];      // (2)
    
        for(int j = 0; j < 3; j++)
            myArray[i][j] = new int(); // (3)
    }
    
    for(int i = 0; i < 100; i++)
    {
        for(int j = 0; j < 3; j++)
            delete myArray[i][j];      // (3)
    
        delete [] myArray[i];          // (2)
    }
    
    delete [] myArray;                 // (1)
    
    int***myArray=newint**[100];//(1)
    对于(int i=0;i<100;i++)
    {
    myArray[i]=新int*[3];//(2)
    对于(int j=0;j<3;j++)
    myArray[i][j]=new int();/(3)
    }
    对于(int i=0;i<100;i++)
    {
    对于(int j=0;j<3;j++)
    删除myArray[i][j];/(3)
    删除[]myArray[i];/(2)
    }
    删除[]myArray;//(1)
    
    你可以看到它的“反向”性质

  • 只需使用向量,就可以轻松排序
    for(int i = 0; i < 100; i++)
        delete [] myArray[i];              // delete all "rows" in every "column"
    
    delete [] myArray;                     // delete all "columns"
    
    int*** myArray = new int**[100];   // (1)
    
    for(int i = 0; i < 100; i++)
    {
        myArray[i] = new int*[3];      // (2)
    
        for(int j = 0; j < 3; j++)
            myArray[i][j] = new int(); // (3)
    }
    
    for(int i = 0; i < 100; i++)
    {
        for(int j = 0; j < 3; j++)
            delete myArray[i][j];      // (3)
    
        delete [] myArray[i];          // (2)
    }
    
    delete [] myArray;                 // (1)