二维数组分配中的内存管理

Memory management in allocating 2-D array

本文关键字:内存 管理 分配 二维数组      更新时间:2023-10-16

我已经使用以下代码分配了一个二维数组:

// Dynamic allocation
        int **matrix=new int*[n];
        for(int i=0;i<n;i++)
        {
            matrix[i]=new int[n];
        }

这很好用。

  • 首先,我们分配一个整数指针数组
  • 然后,我们进一步将前面的每个指针分配到n整数的内存位置。这创建了我们的二维数组

我知道动态分配数组的析构函数应该是这样的:

~SquareMatrix()
{
delete [] OneDarray;
}

重点放在[]上,因为如果不写入,只会删除数组的第一个元素。

基于类似的理由,我想我需要放置[]两次,以便删除整个二维数组,比如

delete [] [] matrix;

但这不起作用,并导致编译时出错。

正确的做法是什么

for(int i=0;i<n;i++)
{
    delete [] matrix[i];
}
delete [] matrix

您需要删除每个内部数组,然后删除该数组。

正如评论中所建议的那样。更安全的方法是使用标准容器,如std::vector。你可以这样做:

std::vector<std::vector<int>> matrix;

这将为您提供一个二维数组,但您不必处理清理。

"正确的方法是什么?"

使用标准容器,例如std::vector<std::vector<int>>std::array<std::array<int,N>,N>(假定N在编译时已经已知)是正确的方式
您没有在第一位使用new()/new[]delete/delete[](除了罕见的有效用例)。

如果你确定你有这样的情况,你可以按照与使用new[]分配完全相反的顺序删除。正如编译器已经告诉您的那样,delete [][];不是有效的语法。