微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在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>>

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。