在2维数组上使用delete []时访问冲突

问题描述

我正在使用C ++进行矩阵乘积练习(实际上是strassen算法)。由于给定的最大数据集达到2048 * 2048,因此我尝试使用delete []释放临时内存。但是它说其中存在内存访问冲突,为什么?

以下一些代码可能会有所帮助:

struct Matrix {
    int row,column;
    int** m;

    Matrix(int row,int column) {
        m = new int* [2048];
        for (int i = 0; i < row; i++)
            m[i] = new int[2048];
    }

    ~Matrix() {
        if (m != NULL) {
            for (int i = 0; i < 2048; i++) {
                delete[] m[i]; //access violation happens here
            }
            delete[] m;
        }
    }
};

Matrix matAdd(Matrix matA,Matrix matB) {
    Matrix matR = Matrix(matA.row,matA.column);
    for (int i = 0; i < matA.row; i++)
        for (int j = 0; j < matA.column; j++) {
            matR.m[i][j] = matA.m[i][j] + matB.m[i][j];
        }
    return matR;
}

//There are some other functions below but the structure is basically the same

解决方法

从索引行开始的数组中的指针未初始化。

Matrix(int row,int column) {
    m = new int* [2048];
    for (int i = 0; i < row; i++)
        m[i] = new int[2048];

    // Initialize rest elements with null pointer.
    for (int i = row; i < 2048; i++)
        m[i] = nullptr;
}

其余的初始化将修复崩溃,但是随后您将在double free上崩溃。原因:您使用类的副本,因此需要实现副本构造函数和赋值运算符,或者使用共享指针而不是原始指针。默认副本使指针指向相同的分配对象。

还要看示例https://stackoverflow.com/a/1403180/6752050的答案,该示例如何创建具有单一分配的二维矩阵。

,

您应该考虑使用std::vector<std::vector<int>>

您的课程缺少复制构造函数和复制分配,我敢肯定这是双重免费的情况。