我正在编写一个使用可变电路板尺寸的非常简单的井字游戏
这些是直接处理内存的代码:
game_board::game_board(int size) {
_size = size;
_board = (player**) std::malloc(_size * sizeof(player *));
// fill the memory block with memory blocks, making it a 2D array
for (int c = 0; c < _size; c++)
_board[c] = (player*) std::malloc(_size * sizeof(player));
// fill the entire matrix with player::NONE values
for (int c = 0; c < _size; c++)
for (int r = 0; r < _size; r++)
_board[c][r] = player::NONE;
}
game_board::~game_board() {
if (_board) std::free(_board);
}
然而,当我尝试调用析构函数时,Xcode会抛出以下错误:
tic-tac-toe-cpp(63230,0x7fff77fa5310) malloc: *** error for object 0x100200000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
我还尝试使用template
来设置数组大小,但编译器不允许我使用变量来执行此操作,这导致我使用malloc
代替。
这里发生了什么,我该如何解决?
注意
这样做:
game_board::~game_board() {
for (int i = 0; i < _size; i++)
std::free(_board[i]);
if (_board) std::free(_board);
}
使程序失败的方式相同(除了程序在循环中停止),这就是为什么上面的析构函数中没有循环的原因,因为我认为它是导致问题...
答案 0 :(得分:2)
game_board::~game_board() {
for (int c = 0; c < _size; c++)
std::free(_board[c]);
std::free(_board);
}
但更喜欢std::vector
此外,您应该实施copy constructor
和assignment operator
或通过私有化来禁用它们。
编辑从您的代码中明确调用obj.~game_board();
。这导致析构函数被调用两次并且双重释放。请不要写那个。自动调用局部变量的析构函数,您无需显式调用它。