问题描述
我正在使用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>>
。
您的课程缺少复制构造函数和复制分配,我敢肯定这是双重免费的情况。