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

Sabthever 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;
}


谢谢各路大佬
...全文
620 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sabthever 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】为空。
Sabthever 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 楼 真相重于对错 的回复:
没有拷贝构造函数,百度深浅复制的区别
我这儿用赋值符号重载,应该和深复制差不多吧
不一样,赋值不是复制,要考虑到中间结果会有复制。
Sabthever 2021-05-17
  • 打赏
  • 举报
回复
引用 2 楼 真相重于对错 的回复:
没有拷贝构造函数,百度深浅复制的区别
我这儿用赋值符号重载,应该和深复制差不多吧
Sabthever 2021-05-17
  • 打赏
  • 举报
回复
引用 1 楼 maguangzhi 的回复:
多半遇到了空指针或m【i】为空。
释放了动态空间后是不是这个指针地址也被删了呀
真相重于对错 2021-05-17
  • 打赏
  • 举报
回复
没有拷贝构造函数,百度深浅复制的区别
内容概要:本文围绕四开关Buck-Boost变换器的建模分析与闭环仿真性能展开研究,重点探讨其在Simulink环境下的稳压控制特性与系统动态响应。通过建立精确的状态空间平均法数学模型,设计基于PI调节器的闭环控制系统,并结合仿真手段验证了变换器在不同输入电压和负载条件下的输出电压稳定性与抗扰动能力。研究涵盖主电路拓扑结构、工作模态分析、小信号建模、控制器参数整定及Simulink仿真平台搭建等关键技术环节,实现了对升降压过程的平滑切换与高性能电压调节。同,文强调科研过程应注重逻辑思维与创新意识的培养,倡导借助成熟仿真工具提升研究效率与系统设计水平。; 适合人群:具备电力电子技术基础、熟悉Simulink仿真环境,从事新能源变换系统、电源设计等相关方向的研究生或工程技术人员。; 使用场景及目标:①掌握四开关Buck-Boost变换器的工作原理与状态空间建模方法;②学习基于Simulink的闭环控制器设计与动态性能仿真验证流程;③为电力电子变换器的稳定性分析、控制器优化及工程化实现提供理论支持与实践参考。; 阅读建议:建议读者结合文的仿真模型逐步操作,重点关注电路工作模态推导与控制器设计部分,深入理解系统稳定性判据与参数 tuning 方法,同关注科研方法论的引导,提升系统性思维与仿真实践能力。
内容概要:本文详细介绍了基于自适应虚拟阻抗的光储并网系统谐波抑制策略的Simulink仿真实现方法,旨在通过构建高精度的仿真模型解决光伏发电与储能系统在并网过程引发的谐波污染问题。文深入剖析了自适应虚拟阻抗技术的核心原理,重点阐述其在动态调节阻抗参数以应对电网阻抗波动、有效抑制并网电流谐波、提升电能质量和系统稳定性方面的关键技术优势。该策略能够根据实运行工况自适应调整控制参数,显著增强系统对复杂电网环境的适应能力。资源配套完整的Matlab/Simulink仿真模型与可运行代码,支持用户完美复现仿真结果,并为进一步的算法优化、控制器设计及学术研究提供坚实的技术基础。; 适合人群:具备电力电子、新能源并网、自动控制理论等相关专业知识背景的科研人员,包括从事相关课题研究的研究生、高校教师及电力系统领域的工程技术人员;熟悉Matlab/Simulink仿真平台并希望深入理解先进并网控制策略的研发人员; 使用场景及目标:①用于光储混合系统的电能质量分析与谐波治理关键技术研究;②支撑高水平学术论文的复现、科研项目申报及实际工程并网逆变器控制器的设计与性能验证;③作为高校研究生课程或科研培训的教学案例,帮助学生深入理解虚拟阻抗控制机理、自适应算法设计及其在提升并网系统动态响应特性的应用; 阅读建议:建议读者结合提供的仿真模型进行分模块调试与整体运行,重点关注控制器参数的整定过程、系统在不同电网条件下的频率响应特性和谐波抑制效果,同建议参考相关领域的权威文献,以深化对自适应控制策略的理解,实现从仿真复现到技术创新的跨越。

65,210

社区成员

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

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