首页 > 解决方案 > 如何在 CPP 中删除动态非矩形二维数组

问题描述

这是我为了理解使用指针而编写的一些代码。这里我要分配和显示一个二维Pointerarray

int main()
{
    constexpr int size = 10;
    int** _2darray = new int* [size];

    for ( int i = 0; i < size; i++ )
    {
        *(_2darray + i) = new int[i];
        for ( int j = 0; j <= i; j++ )
        {
            *(*(_2darray + i) + j) = j;
        }
    }

    for ( int i = 0; i < size; i++ )
    {
        for ( int j = 0; j <= i; j++ )
        {
            std::cout << _2darray[i][j] << " ";
        }
        std::cout << std::endl;
    }
}

这将导致打印:

0
0 1
0 1 2
0 1 2 3
0 1 2 3 4
0 1 2 3 4 5
0 1 2 3 4 5 6
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8 9

但是,如果我现在想防止内存泄漏,我想这样做:

for ( int i = 0; i < size; i++ )
  {
       delete[] _2darray[i];
  }
  delete[] _2darray;

不幸的是,这会给我一个例外,即堆已损坏

在此处输入图像描述

我猜它崩溃是因为它不知道子数组的确切大小,但我也听说delete总是跟踪为数组分配了多少字节。

感谢您的简短回答。

标签: c++arrayspointersmemorydynamic

解决方案


您的删除逻辑是正确的。

该错误消息意味着您的程序正在写入超出范围的内存。然而,这里的比较j <= i并不是不正确的——我的意思是假设程序当前正在生成你想要的输出。

请注意,您希望您的第i个数组包含i+1项目。特别注意第零个数组必须包含一项(即零),所以*(_2darray + i) = new int[i]应该是*(_2darray + i) = new int[i+1]

有了这种变化,带有j <= i比较的 for 循环是正确的。索引 j 将遍历包含项目的第i个数组中的每个i+1项目。从零开始时,比较j < i只会产生ij <= i次迭代,因此在这种情况下您确实需要,即使这样的比较看起来不标准。考虑j < i+1,这是等效的,但可能更清楚。


推荐阅读