我创建了一个Nodes
的二维数组(Node
类在一个单独的文件中),我想知道如何解除分配(下图)。我尝试了很多方法,但仍然会出现漏洞。
board = new Node * [r];
//creats a column for each element in the row
for(int i = 0; i < r; i++) {
board [i] = new Node [c];
}
(r
是行,c
是cols)
我做到了这一点:
for(int i = 0; i < r; i++) {
delete [] board[i];
}
delete [] board;
但显然这还不够
答案 0 :(得分:2)
您拥有的代码是正确和充分的。但是,最好使用RAII,这样您根本不需要显式调用delete
(可能甚至不是new
)。例如,你可以创建一个std::vector<std::vector<Node>>
,或者更好的是某种矩阵类(不幸的是,不是在标准库中)。
答案 1 :(得分:1)
您的解决方案是释放二维数组的正确方法。但是,如果Node
使用动态内存并且未正确定义析构函数,则可能仍会出现内存泄漏。
答案 2 :(得分:0)
正如其他人所说,您正确配对所有new[]
和delete[]
:假设没有错误发生,此代码分配的内存将被正确释放。
唯一的问题是可能会发生错误,特别是可能会抛出异常:
new[]
无法分配内存,则会抛出异常(通常不会在桌面操作系统上发生,但您仍应像编写代码一样编写代码。)Node
的构造函数可能会抛出。即使你设计的构造函数不会抛弃你,通常也不应该利用这些知识。只需编写代码就像抛出一样。使此代码异常安全的最佳方法是使用RAII。例如,使用vector
代替new[]
/ delete[]
。
使用指针数组和每行的单独分配对于“粗糙”#39;数组,其中每行可以是不同的长度。在你的情况下,你有矩形数组,所以你可以使用单个分配整个事情。
std::vector<Node> board(rows*columns);
board[row_index*columns + column_index] // replaces board[row_index][column_index]
您可以通过将其放在一个类中来隐藏实现:
class Board {
std::vector<Node> board_data;
public:
const int rows;
const int columns;
Board(int rows_, int columns_)
: board_data(rows_*columns_)
, rows(rows_)
, columns(columns_)
{}
struct board_index { int row, column; };
Node &operator[](board_index i) {
assert(0 <= i.row && i.row < rows);
assert(0 <= i.column && i.column < columns);
return board_data[i.row * columns + i.column];
}
};
Board board(r, c);
通过上述实施,您将board[i][j]
替换为board[{i, j}]
。
board[{i, j}] = ... // assign to a place on the board
board[{i, j}].foo(); // call a Node method
std::cout << board[{i, j}]; // print a Node
// etc.