删除引用时,释放的指针未分配错误

时间:2014-11-12 07:34:41

标签: c++ memory-management

我正在编写一个使用可变电路板尺寸的非常简单的井字游戏

这些是直接处理内存的代码:

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);
}

使程序失败的方式相同(除了程序在循环中停止),这就是为什么上面的析构函数中没有循环的原因,因为我认为它是导致问题...

1 个答案:

答案 0 :(得分:2)

game_board::~game_board() {
    for (int c = 0; c < _size; c++)
        std::free(_board[c]);
    std::free(_board);
}

但更喜欢std::vector

此外,您应该实施copy constructorassignment operator或通过私有化来禁用它们。

编辑从您的代码中明确调用obj.~game_board();。这导致析构函数被调用两次并且双重释放。请不要写那个。自动调用局部变量的析构函数,您无需显式调用它。

Live working code