C++ 删除动态分配的二维数组

C++ 删除动态分配的二维数组,c++,memory-management,delete-operator,C++,Memory Management,Delete Operator,所以我习惯于C语言中的内存管理,其中空闲(指针)将释放指针所指向的所有空间。现在我在试图做一些简单的C++时困惑了自己。 如果我有一个二维数组,它是以类似的方式分配的 double** atoms = new double*[1000]; for(int i = 0; i < 1000; i++) atoms[i] = new double[4]; 理解delete和delete[]运算符之间的区别是否重要?或者我可以假设,每当我分配一个带有ptr=new x[]的数组时,我还必须用

所以我习惯于C语言中的内存管理,其中
空闲(指针)
将释放
指针所指向的所有空间。现在我在试图做一些简单的C++时困惑了自己。
如果我有一个二维数组,它是以类似的方式分配的

double** atoms = new double*[1000];
for(int i = 0; i < 1000; i++)
  atoms[i] = new double[4];

理解
delete
delete[]运算符之间的区别是否重要?或者我可以假设,每当我分配一个带有
ptr=new x[]
的数组时,我还必须用
delete[]ptr
解除分配它?

实际上,指针指向的指针数组仍然是一个整数数据类型或数字数组,用于保存内存地址。您应该同时使用
delete[]

另外,是的,
new[]
意味着
delete[]

当您创建一个数组时,实际上是在创建一个数字数组,该数组恰好包含另一个数字数组的内存地址。无论如何,它们都是数字数组,所以请使用
delete[]
删除这两个数组

#包括
int main(){
//嘿,指针的大小是有限的,不管是间接级别!

std::cout带有
delete[]
的版本有效。如果调用
delete[]
对于非数组对象,它是一个ub。你可以在其他SO问题中看到:谢谢,出于某种原因,我很难找到这样的帖子……但这就很清楚了。我将此标记为该问题的副本只是为了清楚,指针的类型不一定是
int
long
或任何其他类型。该标准定义了可以强制转换为算术类型的特定类型:
std::intptr\u t
std::uintptr\u t
。由于大小不同(如果您可以想象一个奇怪的体系结构,其中指针是
),可能会有一些非常奇怪的东西,
int
std::intptr\u t
可能有不同的大小(例如32位
int
和64位
std::uintptr\u t
值)。
for(int i = 0; i < 1000; i++)
  delete atoms[i];
delete atoms;
for(int i = 0; i < 1000; i++)
  delete[] atoms[i];
delete[] atoms;
#include <iostream>

int main() {

    //Hey, pointers have a finite size, no matter the indirection level!
    std::cout << "sizeof(int*): " << sizeof(int*) << std::endl;
    std::cout << "sizeof(int**): " << sizeof(int**) << std::endl;
    std::cout << "sizeof(int***): " << sizeof(int***) << std::endl;

    //Create an array of pointers that points to more arrays
    int** matrix = new int*[5];
    for (int i = 0; i < 5; ++i) {
        matrix[i] = new int[5];
        for (int j = 0; j < 5; ++j) {
            matrix[i][j] = i*5 + j;
        }
    }

    //Print out the matrix to verify we have created the matrix
    for (int j = 0; j < 5; ++j) {
        for (int i = 0; i < 5; ++i) {
            std::cout << matrix[j][i] << std::endl;
        }
    }

    //Free each sub-array
    for(int i = 0; i < 5; ++i) {
        delete[] matrix[i];   
    }
    //Free the array of pointers
    delete[] matrix;

    return 0;
}