繁体   English   中英

分配二维字符数组

[英]Allocating 2d array of chars

建设者

这就是我的分配方式:

char **board = new char*[width];
for(i = 0; i < width; i++){
    board[i] = new char[height];
    for(j = 0; j < height; j++)
        board[i][j] = 0;
}
this->board = &board;

在课程内部,它是:

char ***board;

析构函数:

现在我想删除它,所以我写了这个(将它放在类字段中):

for(i = 0; i < width; i++)
    delete (*board)[i];
delete (*board);

运行此命令时:

Board* b = new Board(16, 30, 99);
delete b;

我收到未处理的异常。 为什么?

您将在堆栈上存储一个指向变量的指针,该变量在构造函数返回后立即失效。 您应该将类​​的数据成员声明为char **board然后分配this->board = board

编辑:另请参阅@Kerrek SB的评论。 局部变量是多余的。 只需直接使用数据成员(无需this-> )。

编辑2:最好将矩形数组创建为单个数组,并使用指针算术索引(这是编译器对已声明的2D数组所做的工作):

char *board;
...
board = new char[width*height];
for(i = 0; i < width*height; ++i){
    board[i] = 0;
}
...
char& operator()(int i, int j) { return board[width*i + j]; }

这样的好处是只需要分配一个内存(因此需要一个delete[] )。 由于单元是连续的,因此还可以提高缓存的局部性。

更好的是,如果您知道编译时的尺寸,请使用模板:

template <int W, int H>
class Board {
    char board[W][H];
    ...
};
...
Board<8, 8>* b = new Board<8, 8>(...);

这根本不需要分配内存(当然,除了new Board )。

您需要delete new都以完全相同的方式进行:

board = new char*[width];
...
board[i] = new char[height];
...
...
delete[] board[i];
delete[] board;

在这种情况下,不需要取消引用。

您应该使用C ++的功能。

class Board
{
    std::vector<std::vector<char>> board;

public:
    Board(std::vector<std::vector<char>> const& board) : board(board) {}

    Board(size_t x, size_t y, char val = 0)
    {
        std::vector<char> x2(x, val);
        this->board(y, x2);
    }
};

您现在要做的就是board[y].push_back(char_x_val) ,以便在末尾附加一个新元素。 您可以像对待任何其他2D数组一样处理board[y][x] (嗯,差不多),但是不必担心释放。

这里阅读更多关于向量的信息 (有人知道好的教程吗?)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM