如何解决在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 举报,一经查实,本站将立刻删除。