Вы храните указатель на переменную в стеке, которая становится недействительной, как только возвращается конструктор. Вы должны объявить член данных вашего класса как 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
, конечно).