亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

有深 拷貝 加運算符重載 就報錯了


#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++遠征之模板篇
  • 參與學習       91140    人
  • 解答問題       325    個

本C++教程力求即學即會,所有知識以實踐方式講解到操作層面

進入課程

有深 拷貝 加運算符重載 就報錯了

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號