如何在C ++中解除分配?

时间:2014-12-12 06:30:03

标签: c++ pointers memory nodes

我创建了一个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;

但显然这还不够

3 个答案:

答案 0 :(得分:2)

您拥有的代码是正确和充分的。但是,最好使用RAII,这样您根本不需要显式调用delete(可能甚至不是new)。例如,你可以创建一个std::vector<std::vector<Node>>,或者更好的是某种矩阵类(不幸的是,不是在标准库中)。

答案 1 :(得分:1)

您的解决方案是释放二维数组的正确方法。但是,如果Node使用动态内存并且未正确定义析构函数,则可能仍会出现内存泄漏。

答案 2 :(得分:0)

正如其他人所说,您正确配对所有new[]delete[]:假设没有错误发生,此代码分配的内存将被正确释放。

唯一的问题是可能会发生错误,特别是可能会抛出异常:

    如果
  • new[]无法分配内存,则会抛出异常(通常不会在桌面操作系统上发生,但您仍应像编写代码一样编写代码。)
  • Node的构造函数可能会抛出。即使你设计的构造函数不会抛弃你,通常也不应该利用这些知识。只需编写代码就像抛出一样。
  • 事实上,你应该只是编写代码,好像几乎任何东西都可以抛出。有关编写异常安全代码的更多详细信息,以及此规则的例外情况,您可以阅读http://exceptionsafecode.com
  • 处的信息。

使此代码异常安全的最佳方法是使用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.