【问题标题】:access violation in deleting a 2d array删除二维数组时的访问冲突
【发布时间】:2015-03-31 07:08:56
【问题描述】:

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

    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 文件,我可能很快就会复习一遍,但我宁愿处理这个内存泄漏并继续前进。

【问题讨论】:

  • 你真的需要使用动态分配的对象吗?

标签: c++ arrays pointers delete-operator


【解决方案1】:

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

【讨论】:

  • 谢谢,我知道我只是忘记了一些愚蠢的事情。板阵列实际上在堆栈上,是吗?我已经远离 c++ 太久了,以至于我忘记了一个令人震惊的数量。
  • 是的,它在堆栈上。
【解决方案2】:

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

如果你改用std::vector&lt;std::vector&lt;space&gt;&gt; 会稍微好一点。然后,将为您完成内存管理。

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

一个好的选择是分配一个连续的块并使用约定(i * rows + j) 用于(i, j) 的元素。 std::vector&lt;space&gt; 就足够了。然后考虑使用第 3 方矩阵库,如 BLAS (www.boost.org)。

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    相关资源
    最近更新 更多