为了账号安全,请及时绑定邮箱和手机立即绑定

有深 拷贝 加运算符重载 就报错了


#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;

class Tank
{
public:
friend Tank operator+(const Tank &t1, const Tank &t2);
Tank(int code, int count):m_iCode(code),m_iCount(count)
{
cout <<"tank()"<<endl;
m_p = new char[100];
}
~Tank()
{
cout <<"~tank()"<<endl;
delete []m_p;
m_p = NULL;
}
Tank(const Tank& t);
void getDate()
{
cout << m_iCode <<endl;
cout << m_iCount <<endl;
}
private:
int m_iCode;
int m_iCount;
char *m_p;
};
Tank operator+(const Tank &t1, const Tank &t2)
{
Tank temp(0,0);
temp.m_iCode = t1.m_iCode + t2.m_iCode;
temp.m_iCount = t1.m_iCount + t2.m_iCount;
return temp;
}

Tank::Tank(const Tank& t)
{
cout << "Tank copy()" << endl;
m_iCode = t.m_iCode + 1;
m_iCount = t.m_iCount;
m_p = new char[100];
if(m_p != NULL)
cout <<"copy right"<< endl;
}
int main()
{
Tank t1(10,20);
Tank t2(20,30);
Tank t3(0,0);
t3 = t1 + t2;
t1.getDate();
t2.getDate();
t3.getDate();
return 0;
}

http://img1.sycdn.imooc.com//5982a14d000105fb06770442.jpg

正在回答

3 回答

找到原因了,从你的图中可以看出来虽然你主函数里没有用到深拷贝,但运行时调用了深拷贝函数,所以在最后多释放了两次p[],系统崩溃。

这是由于“=”没有重载导致的,所以主函数中t3=t1+t2,系统理解为了t3=t1,t3+t2。要想解决就要定义重载运算符“=”。下面是代码。

https://img1.sycdn.imooc.com//5b7900e90001a5f206870272.jpg

0 回复 有任何疑惑可以回复我~
#1

HanCHEN

补充更正,用到深拷贝构造函数时说明出现指向同一块内存的问题。 用等号赋值也一样,也会出现这种问题,所以用深拷贝构造函数时就要用到重载的等号运算符。 而不是我之前说的原因。
2018-08-19 回复 有任何疑惑可以回复我~

我正在找原因,事实上点一下重试就能继续运行了

0 回复 有任何疑惑可以回复我~

Tank::Tank(const Tank& t)
{
cout << "Tank copy()" << endl;
m_iCode = t.m_iCode + 1;
m_iCount = t.m_iCount;
m_p = new char[100];
if(m_p != NULL)
cout <<"copy right"<< endl;

delete m_p;

m_p = NULL;
}



释放一下就可以了

0 回复 有任何疑惑可以回复我~
#1

慕粉1950047581 提问者

这里为什么要释放呢。前面才new了 ,后面又释放了,不是就相当于没有深拷贝了吗
2017-08-03 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之模板篇
  • 参与学习       91156    人
  • 解答问题       318    个

本C++教程力求即学即会,所有知识以实践方式讲解到操作层面

进入课程

有深 拷贝 加运算符重载 就报错了

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信