我应该什么时候使用删除? (动态创建二维数组后不删除的后果)
When should I use delete? (Consequences of not deleting after a dynamically created 2d array)
我不熟悉动态分配和指针。我将尝试从文件中填充一个二维动态数组,然后在其上应用迷宫求解算法(wall follower)。
假设我像这样创建一个动态分配的二维数组:
int** board;
board = new int* [rowsize];
for(int row = 0; row < rowsize; row++)
{
board[row] = new int[colsize];
}
如果我知道我不会将此指针用于另一个变量,我可以不对 board
使用 delete 吗?如果不是,可能会出现什么问题(如果您熟悉墙跟随器算法)?另外,如何删除指向指针的指针,delete board
就足够了吗?
如果不删除分配的数组,它们将继续消耗内存,直到程序终止。这在技术上可能没有错,但很浪费。
关于删除 board
- 不,这还不够。您应该删除使用 new
:
分配的每个指针
for(int row = 0; row < rowsize; row++)
{
delete[] board[row];
}
delete[] board;
can I get away with not using delete for board
?
是的,但不会持续很长时间:删除程序分配的数组的重复失败是内存泄漏,最终会使您的进程耗尽内存。
how do I delete a pointer to a pointer, would delete board
be sufficient?
不,您需要删除分配并存储在 board
:
中的每个指针
for(int row = 0; row < rowsize; row++) {
delete[] board[row];
}
delete[] board;
注意delete
后面的方括号表示你删除一个数组,它们很重要。
为矩形矩阵分配释放内存是 C++ 库中已解决的问题。切换到使用向量的向量来避免动态资源分配:
std::vector<std::vector<int>> board(rowsize, std::vector<int>(colsize, 0));
您需要 delete
的是您使用 新分配 的内存。这意味着您不会释放指针本身,而是它指向的堆内存。
所以,您只需要delete[] board
。这将释放 int*
数组。在这种情况下,使用 []
并不是绝对必要的,因为它是一个基本类型数组,但最好始终将它用于数组,这样当它不是那样时你就不会搞砸了。
在数组上调用 delete[]
将调用数组本身内所有对象的析构函数,并释放数组。但是对于基本类型则没有必要。
另请注意,您不需要释放 int** board
。指针是具有某些特殊功能的任何其他变量,但是当您这样声明它们时,它们就像其他任何变量一样在堆栈中分配。
希望对您有所帮助:)
我不熟悉动态分配和指针。我将尝试从文件中填充一个二维动态数组,然后在其上应用迷宫求解算法(wall follower)。
假设我像这样创建一个动态分配的二维数组:
int** board;
board = new int* [rowsize];
for(int row = 0; row < rowsize; row++)
{
board[row] = new int[colsize];
}
如果我知道我不会将此指针用于另一个变量,我可以不对 board
使用 delete 吗?如果不是,可能会出现什么问题(如果您熟悉墙跟随器算法)?另外,如何删除指向指针的指针,delete board
就足够了吗?
如果不删除分配的数组,它们将继续消耗内存,直到程序终止。这在技术上可能没有错,但很浪费。
关于删除 board
- 不,这还不够。您应该删除使用 new
:
for(int row = 0; row < rowsize; row++)
{
delete[] board[row];
}
delete[] board;
can I get away with not using delete for
board
?
是的,但不会持续很长时间:删除程序分配的数组的重复失败是内存泄漏,最终会使您的进程耗尽内存。
how do I delete a pointer to a pointer, would
delete board
be sufficient?
不,您需要删除分配并存储在 board
:
for(int row = 0; row < rowsize; row++) {
delete[] board[row];
}
delete[] board;
注意delete
后面的方括号表示你删除一个数组,它们很重要。
为矩形矩阵分配释放内存是 C++ 库中已解决的问题。切换到使用向量的向量来避免动态资源分配:
std::vector<std::vector<int>> board(rowsize, std::vector<int>(colsize, 0));
您需要 delete
的是您使用 新分配 的内存。这意味着您不会释放指针本身,而是它指向的堆内存。
所以,您只需要delete[] board
。这将释放 int*
数组。在这种情况下,使用 []
并不是绝对必要的,因为它是一个基本类型数组,但最好始终将它用于数组,这样当它不是那样时你就不会搞砸了。
在数组上调用 delete[]
将调用数组本身内所有对象的析构函数,并释放数组。但是对于基本类型则没有必要。
另请注意,您不需要释放 int** board
。指针是具有某些特殊功能的任何其他变量,但是当您这样声明它们时,它们就像其他任何变量一样在堆栈中分配。
希望对您有所帮助:)