分配二维数组时的内存管理
Memory management in allocating 2-D array
我已经使用以下代码分配了一个二维数组:
// 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;
但这不起作用并给出编译时错误。
正确的做法是什么?
"What is the correct way of doing it?"
使用标准容器,例如std::vector<std::vector<int>>
或 std::array<std::array<int,N>,N>
(假设 N
在编译时已知)是 正确的 方式。
您没有在第一位使用 new()
/new[]
和 delete
/delete[]
(除了罕见的有效用例)。
如果您确定遇到这种情况,请按照与使用 new[]
分配时完全相反的顺序进行删除。 delete [][];
不是有效的语法,正如编译器已经告诉你的那样。
for(int i=0;i<n;i++)
{
delete [] matrix[i];
}
delete [] matrix
您需要删除每个内部数组,然后再删除数组。
正如评论中所建议的那样。一种更安全的方法是使用标准容器,例如 std::vector
。那么你可以这样做:
std::vector<std::vector<int>> matrix;
这会给你一个二维数组,但你不必处理清理。
我已经使用以下代码分配了一个二维数组:
// 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;
但这不起作用并给出编译时错误。
正确的做法是什么?
"What is the correct way of doing it?"
使用标准容器,例如std::vector<std::vector<int>>
或 std::array<std::array<int,N>,N>
(假设 N
在编译时已知)是 正确的 方式。
您没有在第一位使用 new()
/new[]
和 delete
/delete[]
(除了罕见的有效用例)。
如果您确定遇到这种情况,请按照与使用 new[]
分配时完全相反的顺序进行删除。 delete [][];
不是有效的语法,正如编译器已经告诉你的那样。
for(int i=0;i<n;i++)
{
delete [] matrix[i];
}
delete [] matrix
您需要删除每个内部数组,然后再删除数组。
正如评论中所建议的那样。一种更安全的方法是使用标准容器,例如 std::vector
。那么你可以这样做:
std::vector<std::vector<int>> matrix;
这会给你一个二维数组,但你不必处理清理。