【问题标题】:Access violation writing location when deleting a matrix删除矩阵时访问冲突写入位置
【发布时间】:2014-06-29 10:20:21
【问题描述】:

我正在编写一个程序来执行一组数值方法。为此,我需要创建任意大小的矩阵并将它们放在函数之间。显然,如果我在使用创建矩阵后不清理它们,我会出现严重的内存泄漏。

double** MatrixInitialize(int m, int n)//generates a A[m][n] matrix
{
    int i = 0, j = 0;
    double** B = new double*[m];
    for (m = 0; m < n; m++)
    {
            B[m] = new double[n];
    }
    for (j = 0;j<m;j++)
            for (i = 0; i < n; i++)
            {
                    B[i][j] = 0;
            }
    return(B);
}

int main()
{
    double** MatrixA;
    MatrixA=MatrixInitialize(2,2) 
    //Some manipulation on MatrixA is done here
    delete[] MatrixA[0]; delete[] MatrixA[1]; delete[] MatrixA; 
    return 0;
}

只要调用 delete[] 行,我就会抛出访问冲突消息并且必须中断。是否有其他程序我必须通过删除这些指针?

【问题讨论】:

  • 注意:您正在修改for (m = 0; m &lt; n; m++)中的函数参数
  • 除了逻辑错误,这里没有问题。该示例未显示实际问题。
  • @Dieter 这实际上是我的程序正在做的所有事情。我创建了 2 个矩阵,对它们的条目执行循环操作,然后想在循环结束时删除它们。我发现如果我做了 MatrixA=NULL;删除[]矩阵A;然后它会运行,但我不能对指针 MatrixA[0] 和 MatrixA[1] 做同样的事情,内存仍然会泄漏
  • //Some manipulation on MatrixA is done here。 Dieter 指出的明显逻辑错误很糟糕(例如,想想当您尝试 2x3 矩阵时会发生什么),您需要发布代码。 在删除之前 将指针设置为 NULL 是没有意义的,并且在所有情况下,除了原始 NULL 值之外,这都是公然的内存泄漏。贴出真实代码; 全部
  • pastebin.com/xCah0vmN 好了。事实上,如果我将指针设置为 NULL 然后删除它们,它似乎实际上并没有泄漏任何内存并且运行得很好。请注意 #include #include #include 是 NAG C 数值方法库的包含项,仅用于 NRMMatrixCalculation 子例程以求解一组线性方程。

标签: c++ memory memory-management memory-leaks


【解决方案1】:

让语言为你工作

int main()
{
    int ysize = 10;
    int xsize = 5;
    std::vector<std::vector<double>> B(ysize, std::vector<double>(xsize, 0));

    for (int y = 0; y < ysize; y++)
    {
        for (int x = 0; x < xsize; x++)
        {
            B[y][x] = 1.23;
        }
    }

    for (int y = 0; y < ysize; y++)
    {
        for (int x = 0; x < xsize; x++)
        {
            std::cout << B[y][x] << " ";
        }
    }
    std::cout << "\n";
}

http://ideone.com/QSoR5M

【讨论】:

  • 这不是和我的 MatrixInitialization 函数做的一样吗?
  • 是的,但它不会泄漏内存或导致访问冲突:)
  • 即使在循环中使用?事实上,我有一个循环调用我在这里列为 int main 的函数,在我注释掉的操作中,我需要将 MatrixA 发送到另一个函数。这种方法是否允许我在多次调用时做到这一点而不会泄漏内存?
  • @MikePegg 在ideone上放个代码示例我会告诉你的
猜你喜欢
  • 2021-12-07
  • 1970-01-01
  • 2021-05-04
  • 2020-09-04
  • 1970-01-01
  • 2015-08-15
  • 2012-12-05
  • 2013-04-15
  • 1970-01-01
相关资源
最近更新 更多