真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++:深拷貝和淺拷貝——拷貝構(gòu)造、賦值構(gòu)造必須自定義-創(chuàng)新互聯(lián)

https://www.bilibili.com/video/BV1qT4y1X7cQ/?spm_id_from=333.337.search-card.all.click&vd_source=d33b44674c517c8b7928e8d3ac316b37

成都創(chuàng)新互聯(lián)公司長期為數(shù)千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為梁溪企業(yè)提供專業(yè)的成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè),梁溪網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

1、賦值運(yùn)算符重載

淺拷貝的錯(cuò)誤代碼:

class Distance
{public:
	int* dis = NULL;
	Distance(int a)
	{dis = new int(a);
	}

	~Distance()
	{if (dis != NULL)
		{	cout<< "~distance"<< endl;
			delete dis;
			dis = NULL;
		}
	}
};


int main()
{Distance p(23);
	Distance p2(24);
	p2 = p; //賦值構(gòu)造
	
	return 0;
} 

在這里插入圖片描述
C++默認(rèn)提供給我們的賦值運(yùn)算符函數(shù),是淺拷貝。默認(rèn)operator=是淺拷貝.
默認(rèn)operator=是淺拷貝.默認(rèn)operator=是淺拷貝.默認(rèn)operator=是淺拷貝.默認(rèn)operator=是淺拷貝.

由于是默認(rèn)的系統(tǒng)提供的賦值函數(shù);所以p2和p指向的是同一塊內(nèi)存;而析構(gòu)的時(shí)候,p1先析構(gòu)了堆內(nèi)存;然后p2再去釋放的時(shí)候,導(dǎo)致釋放失敗。
同時(shí)p2原先指向的堆內(nèi)存并未正確釋放,導(dǎo)致內(nèi)存泄露。

定義自定義的賦值構(gòu)造函數(shù):

class Distance
{public:
	int* dis = NULL;
	Distance(int a)
	{dis = new int(a);
	}

	Distance& operator = (const Distance& other)
	{if (dis != NULL)
		{	delete dis;
			dis = NULL;
		}

		dis = new int(*other.dis);
		return *this;
	}

	~Distance()
	{if (dis != NULL)
		{	delete dis;
			dis = NULL;
		}
	}
};

int main()
{Distance p(23);
	Distance p2(24);
	p2 = p;
	return 0;
} 

這樣為啥不會(huì)出錯(cuò)了呢?因?yàn)閜和p2分別指向自己的一塊獨(dú)立的內(nèi)存,所以各自釋放自己的內(nèi)存不會(huì)失??;而如果是兩個(gè)指針同時(shí)指向一塊內(nèi)存,那如果釋放了多次,則會(huì)出錯(cuò)。

當(dāng)類對象作為參數(shù)傳遞的時(shí)候,調(diào)用的是拷貝構(gòu)造函數(shù),所以這里也會(huì)有拷貝:

class Distance
{public:
	int* dis;
	Distance(int a)
	{dis = new int(a);
	}

	~Distance()
	{if (dis != NULL)
		{	cout<< "~distance"<< endl;
			delete dis;
			dis = NULL;
		}
	}
};

void func(Distance a)  //這里調(diào)用的是拷貝構(gòu)造函數(shù)
{cout<< *a.dis<< endl;
}

int main()
{Distance p(23);
	func(p);
	return 0;
}

2、拷貝構(gòu)造函數(shù)

錯(cuò)誤1:

class Distance
{public:
	int* dis = NULL;
	Distance(int a)
	{dis = new int(a);
	}

	~Distance()
	{if (dis != NULL)
		{	delete dis;
			dis = NULL;
		}
	}
};

int main()
{Distance p(23);
	Distance p2(p); //拷貝構(gòu)造, Distance p2 = p;這個(gè)也是調(diào)用拷貝構(gòu)造,而不是賦值構(gòu)造;

	return 0;
} 

由于C++默認(rèn)提供的拷貝構(gòu)造也是淺拷貝,導(dǎo)致倆指針指向同一個(gè)內(nèi)存,所以釋放多次導(dǎo)致錯(cuò)誤。
Distance p2§; //拷貝構(gòu)造, Distance p2 = p;這個(gè)也是調(diào)用拷貝構(gòu)造,而不是賦值構(gòu)造;

正確做法:

class Distance
{public:
	int* dis = NULL;
	Distance(int a)
	{dis = new int(a);
	}

	Distance(const Distance& other)
	{cout<< "copy constructor"<< endl;
		if (dis != NULL)
		{	delete dis;
		}
		dis = NULL;
		this->dis = new int(*other.dis);
	}

	~Distance()
	{if (dis != NULL)
		{	delete dis;
			dis = NULL;
		}
	}
};

int main()
{Distance p(23);
	Distance p2 = p;

	return 0;
} 

總結(jié):帶有指針的成員,需要自定義拷貝構(gòu)造、賦值構(gòu)造函數(shù),使得每個(gè)對象都有自己獨(dú)立的內(nèi)存空間,防止內(nèi)存釋放報(bào)錯(cuò)。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


分享文章:C++:深拷貝和淺拷貝——拷貝構(gòu)造、賦值構(gòu)造必須自定義-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://weahome.cn/article/dcdjis.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部