我有一个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,我很快就会过去,但我只是想解决这个内存泄漏并继续前进。
答案 0 :(得分:0)
您正在将new
与delete[]
混合。因此,程序的行为未定义。
如果您使用std::vector<std::vector<space>>
,那会稍微好一点。然后,内存管理将为您完成。
但是如果你对矩阵进行建模,那么这也不是一个好的选择:它会有一个“锯齿状边缘”并且分配的内存不是连续的。
一个好的选择是分配一个连续的块,并使用约(i * rows + j)
作为(i, j)
的元素。 std::vector<space>
就足够了。然后考虑使用像BLAS(www.boost.org)这样的第三方矩阵库。
答案 1 :(得分:0)
board
和board[i]
变量不应为delete
d,因为它们尚未由new
分配。