删除2d数组时的访问冲突

时间:2015-03-31 07:08:57

标签: c++ arrays pointers delete-operator

我有一个2d的对象指针数组,我正在尝试为一个对象编写一个deallocator来删除数组中的两个指针,然后删除数组本身。我在像对象的标题中定义数组,如此

    space* board[6][6];

我像这样分配数组中的空间对象:

    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。

我不太清楚该做什么,我已经尝试过四处寻找,似乎我的析构函数应该没问题。我知道如果我有一个不错的编程教育,我会使用更好的东西,比如矢量或其他东西。我现在下载了一个关于人们如何实际使用C ++的pdf,我很快就会过去,但我只是想解决这个内存泄漏并继续前进。

2 个答案:

答案 0 :(得分:0)

您正在将newdelete[]混合。因此,程序的行为未定义

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

但是如果你对矩阵进行建模,那么这也不是一个好的选择:它会有一个“锯齿状边缘”并且分配的内存不是连续的。

一个好的选择是分配一个连续的块,并使用约(i * rows + j)作为(i, j)的元素。 std::vector<space>就足够了。然后考虑使用像BLAS(www.boost.org)这样的第三方矩阵库。

答案 1 :(得分:0)

boardboard[i]变量不应为delete d,因为它们尚未由new分配。