删除二维数组时的访问冲突

access violation in deleting a 2d array

我有一个对象指针的二维数组,我正在尝试为一个对象编写一个释放器,以删除数组中的两个指针,然后删除数组本身。我在要销毁的对象的头部定义了数组,像这样

    space* board[6][6];

我像这样在数组中分配 space 个对象:

    board[0][0]= new space(1,0);
    board[0][1] = new space(1, 0);
    board[0][2] = new space(1, 0);

我现在的析构函数是这样的

    for (int i = 0; i < 6; ++i)
{
    for (int j = 0; j < 6; ++j){
        delete board[i][j];
    }
    delete[] board[i];
}
delete[] board; 

当我执行此操作时,我收到此消息:Blitz.exe 中 0x5080A9E8 (msvcr120d.dll) 处未处理的异常:0xC0000005:访问冲突读取位置 0xFEEEFEE2。

我不太确定该怎么做,我试过环顾四周,看来我的析构函数应该没问题。我知道如果我受过良好的编程教育,我会使用更好的东西,比如矢量或其他东西。我下载了一个 pdf 文件,介绍人们最近如何实际使用 C++,我可能很快就会回顾它,但我宁愿只处理这个内存泄漏并继续前进。

您正在混合使用 newdelete[]。因此,您的程序的行为是 undefined.

如果改用 std::vector<std::vector<space>> 会好一点。然后,内存管理会为您完成。

但是,如果您正在为矩阵建模,那么这也不是一个好的选择:它将有一个 "jagged edge" 并且分配的内存不是连续的。

一个好的替代方法是分配一个连续的块并对 (i, j) 处的元素使用约定 (i * rows + j)std::vector<space> 就足够了。然后考虑使用像 BLAS (www.boost.org).

这样的第 3 方矩阵库

boardboard[i] 变量不应该 deleted 因为它们还没有被 new 分配。