c++中0xC0000005: 读取位置 0xDDDDDDDD 时发生访问冲突

P小T天Y天 2021-05-16 08:39:27
我是个初学者,然后一直发生这个错误,我无法解决,哪位大神帮忙看一下


定义了两个运算符重载,一个是数组赋值,一个是数组相加
然后源代码是这样的:
#include <iostream>
#include <stdlib.h>
using namespace std;

class Matrix
{
private:
int row;
int col;
int** m;
public:
Matrix(int , int );
Matrix()
{
int i;
row = 1;
col = 1;
m = new int* [row];
for (i = 0; i < row; i++)
m[i] = new int[col];
}
Matrix operator + (const Matrix&);
Matrix & operator = (const Matrix&);
void disp();
~Matrix();
};

Matrix::Matrix(int r, int c):row(r), col(c)
{
int i, j;
m = new int*[row];
for(i = 0; i < row ;i++)
m[i]=new int[col];
cout << "请输入该矩阵元素:" << endl;
for(i = 0; i <row; i++)
for(j = 0;j<col;j++)
cin >> m[i][j];
}

Matrix Matrix::operator+(const Matrix& n)
{
int i, j;
if (row == n.row && col == n.col)
{
Matrix x;
x.row = row;
x.col = col;
x.m = new int* [row];
for (i = 0; i < row; i++)
x.m[i] = new int[col];
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
x.m[i][j] = m[i][j] + n.m[i][j];
return x;
}
else
{
cout << " program terminated! ";
exit(1);
}
}

Matrix & Matrix::operator = (const Matrix &n)
{
int i, j;
if (row == n.row && col == n.col)
{
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
m[i][j] = n.m[i][j];
}
else
{
for (i = 0; i < row; i++)
delete[] m[i];
delete[] m;
row = n.row;
col = n.col;
m = new int*[row];
for (i = 0; i < row; i++)
m[i] = new int[col];
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
m[i][j] = n.m[i][j];
}
return *this;
}

void Matrix::disp()
{
for(int i=0;i<row;i++)
{
cout << '\t';
for(int j=0;j<col;j++)
cout<<m[i][j]<<'\t';
cout << endl;
}
}

Matrix::~Matrix()
{
int i;
for(i=0;i<row;i++)
delete [] m[i];
delete [] m;
}

int main()
{
int row_a,col_a,row_b,col_b;
cout<<"请输入am矩阵的行数和列数:"<<endl;
cin>>row_a>>col_a;
Matrix am(row_a,col_a);
cout<<"请输入bm矩阵的行数和列数:"<<endl;
cin>>row_b>>col_b;
Matrix bm(row_b,col_b),cm;
cout<<"am:"<<endl;
am.disp();
cout<<"bm:"<<endl;
bm.disp();
cm=am+bm;
cout<<"cm=am+bm:"<<endl;
cm.disp();
am=bm;
cout<<"am=bm:"<<endl;
am.disp();
return 0;
}


谢谢各路大佬
...全文
454 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
P小T天Y天 2021-05-19
  • 打赏
  • 举报
回复 1
引用 8 楼 NorZ 的回复:
[quote=引用 7 楼 P小T天Y天 的回复:][quote=引用 6 楼 真相重于对错 的回复:]例如 T a,b,c; a=b+c; 首先b+c,执行operator+() 这个函数的返回值是一个临时变量,要通过计算结果复制到这个临时变量,然后a再根据那个返回值(临时变量)赋值。所以你要提供拷贝构造函数。
也就是我代码里的operator =()不能用于c=a+b,这个等号一定代表深复制吗[/quote] 是说你 operator+ 的返回值的问题,因为你这里是一个局部变量,所以返回时会调用拷贝构造,但是你没有实现深拷贝,所以operator+的返回值是一个浅拷贝的对象[/quote]懂了懂了,谢谢
NorZ 2021-05-18
  • 打赏
  • 举报
回复
引用 7 楼 P小T天Y天 的回复:
[quote=引用 6 楼 真相重于对错 的回复:]例如 T a,b,c; a=b+c; 首先b+c,执行operator+() 这个函数的返回值是一个临时变量,要通过计算结果复制到这个临时变量,然后a再根据那个返回值(临时变量)赋值。所以你要提供拷贝构造函数。
也就是我代码里的operator =()不能用于c=a+b,这个等号一定代表深复制吗[/quote] 是说你 operator+ 的返回值的问题,因为你这里是一个局部变量,所以返回时会调用拷贝构造,但是你没有实现深拷贝,所以operator+的返回值是一个浅拷贝的对象
maguangzhi 2021-05-17
  • 打赏
  • 举报
回复
多半遇到了空指针或m【i】为空。
P小T天Y天 2021-05-17
  • 打赏
  • 举报
回复
引用 6 楼 真相重于对错 的回复:
例如 T a,b,c; a=b+c; 首先b+c,执行operator+() 这个函数的返回值是一个临时变量,要通过计算结果复制到这个临时变量,然后a再根据那个返回值(临时变量)赋值。所以你要提供拷贝构造函数。
也就是我代码里的operator =()不能用于c=a+b,这个等号一定代表深复制吗
真相重于对错 2021-05-17
  • 打赏
  • 举报
回复
例如 T a,b,c; a=b+c; 首先b+c,执行operator+() 这个函数的返回值是一个临时变量,要通过计算结果复制到这个临时变量,然后a再根据那个返回值(临时变量)赋值。所以你要提供拷贝构造函数。
真相重于对错 2021-05-17
  • 打赏
  • 举报
回复
引用 4 楼 P小T天Y天 的回复:
引用 2 楼 真相重于对错 的回复:
没有拷贝构造函数,百度深浅复制的区别
我这儿用赋值符号重载,应该和深复制差不多吧
不一样,赋值不是复制,要考虑到中间结果会有复制。
P小T天Y天 2021-05-17
  • 打赏
  • 举报
回复
引用 2 楼 真相重于对错 的回复:
没有拷贝构造函数,百度深浅复制的区别
我这儿用赋值符号重载,应该和深复制差不多吧
P小T天Y天 2021-05-17
  • 打赏
  • 举报
回复
引用 1 楼 maguangzhi 的回复:
多半遇到了空指针或m【i】为空。
释放了动态空间后是不是这个指针地址也被删了呀
真相重于对错 2021-05-17
  • 打赏
  • 举报
回复
没有拷贝构造函数,百度深浅复制的区别

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧