gpt4 book ai didi

c++ - 分配二维字符数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:16:45 26 4
gpt4 key购买 nike

构造函数

这就是我分配它的方式:

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:最好将矩形数组创建为单个数组,使用指针算法来索引(编译器无论如何都会对已声明的二维数组执行此操作):

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 除外)。

关于c++ - 分配二维字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7464791/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com