最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++的深淺拷貝和寫時(shí)拷貝你了解嗎

 更新時(shí)間:2022年03月23日 10:54:33   作者:林慢慢腦瓜子嗡嗡的  
這篇文章主要為大家詳細(xì)介紹了C++的深淺拷貝和寫時(shí)拷貝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

1.淺拷貝

淺拷貝:對(duì)于有申請(qǐng)空間的對(duì)象的類來(lái)說(shuō),是按照字節(jié)序依次拷貝過(guò)去的,并沒(méi)有另外申請(qǐng)一塊空間。因此,在調(diào)用析構(gòu)函數(shù)的時(shí)候會(huì)造成同一塊空間釋放兩次的情況,從而使程序崩潰。

如下實(shí)例:

class string
{
public:
	string(const char* str)
	{
		//構(gòu)造string類對(duì)象時(shí),如果傳遞nullptr指針
		//認(rèn)為程序非法,此處斷言下
		assert(str);
		_str = new char[strlen(str) + 1];
		strcpy(_str, str);
	}
	~string()
	{
		if (_str)
		{
			delete[] _str;
			_str = nullptr;
		}
	}
private:
	char* _str;
};
void test()
{
	string s1("linmanman");
	string s2(s1);
}

運(yùn)行看看,報(bào)錯(cuò)了

image-20211119153738386

分析錯(cuò)因:

image-20211119155522526

image-20211119160321325

淺拷貝是指向同一塊空間的,這樣就會(huì)有倆個(gè)無(wú)法避免的問(wèn)題:

1.析構(gòu)倆次空間,程序崩潰

2.其中一個(gè)的值被修改了,會(huì)影響到另外一個(gè)的值。

深拷貝:給每個(gè)對(duì)象單獨(dú)分配資源,就是給待拷貝的對(duì)象另開一片空間,再把原對(duì)象空間上的值拷貝過(guò)來(lái),這樣在調(diào)用析構(gòu)函數(shù)的時(shí)候就不會(huì)產(chǎn)生沖突。

image-20220213125937937

image-20211119160705278

2.深拷貝

傳統(tǒng)寫法的string類的深拷貝是自己開空間,自己將拷貝的對(duì)象拷貝到待拷貝對(duì)象中。

string(const string& s)
 : _str(new char[strlen(s._str)+1])
 {
 strcpy(_str, s._str);
 }
 string& operator=(const string& s)
 {
 if(this != &s)
 {
 char* pStr = new char[strlen(s._str) + 1];
 strcpy(pStr, s._str);
 delete[] _str;
 _str = pStr;
 }
 return *this;
 }

現(xiàn)代寫法的string類的深拷貝堪稱是“移花接木”

string(const string& s)
	:_str(nullptr)//必須置空,因?yàn)開str開始是個(gè)隨機(jī)數(shù),交換給tmp._str后,釋放會(huì)引起問(wèn)題
{
	string tmp(s._str);//直接利用構(gòu)造函數(shù),給tmp對(duì)象開辟了一塊空間
	swap(tmp);
}
string& operator=(string s)
{
	swap(s);//這個(gè)swap是咱們自己寫的哦
	return *this;
}

順帶提一嘴,各個(gè)編譯器深拷貝的底層實(shí)現(xiàn)略有差異(當(dāng)然邏輯是一樣的)

VS 2013下的深拷貝

image-20220213130133785

g++下的深拷貝

image-20220213130200116

3.引用計(jì)數(shù)+寫時(shí)拷貝

寫時(shí)拷貝就是一種拖延癥, 是在淺拷貝的基礎(chǔ)之上增加了引用計(jì)數(shù)的方式來(lái)實(shí)現(xiàn)的。

引用計(jì)數(shù):用來(lái)記錄資源使用者的個(gè)數(shù)。在構(gòu)造時(shí),將資源的計(jì)數(shù)給成1,每增加一個(gè)對(duì)象使用該資源,就給計(jì)數(shù)增加1,當(dāng)某個(gè)對(duì)象被銷毀時(shí),先給該計(jì)數(shù)減1,然后再檢查是否需要釋放資源,如果計(jì)數(shù)為1,說(shuō)明該對(duì)象時(shí)資源的最后一個(gè)使用者, 將該資源釋放;否則就不能釋放,因?yàn)檫€有其他對(duì)象在使用該資源。

image-20220213130242526

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容! 

相關(guān)文章

  • VC多線程編程詳解

    VC多線程編程詳解

    這篇文章主要介紹了VC多線程編程,實(shí)例形式詳細(xì)分析了多線程編程的原理與實(shí)現(xiàn)方法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C++日期類計(jì)算器的模擬實(shí)現(xiàn)舉例詳解

    C++日期類計(jì)算器的模擬實(shí)現(xiàn)舉例詳解

    兩個(gè)日期之間相隔天數(shù)的計(jì)算網(wǎng)上有許多的軟件,這里主要介紹如何使用C/C++語(yǔ)言來(lái)完成這樣的功能,下面這篇文章主要給大家介紹了關(guān)于C++日期類計(jì)算器的模擬實(shí)現(xiàn),需要的朋友可以參考下
    2023-04-04
  • C語(yǔ)言實(shí)現(xiàn)掃雷游戲(可以自動(dòng)展開)

    C語(yǔ)言實(shí)現(xiàn)掃雷游戲(可以自動(dòng)展開)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷游戲,可以自動(dòng)展開,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C語(yǔ)言文件操作之fread函數(shù)詳解

    C語(yǔ)言文件操作之fread函數(shù)詳解

    fread()函數(shù)用來(lái)從指定文件中讀取塊數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言文件操作之fread函數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • C語(yǔ)言整形提升舉例詳解

    C語(yǔ)言整形提升舉例詳解

    對(duì)于整形提升,高位需要補(bǔ)位,那么補(bǔ)什么呢,無(wú)符號(hào)數(shù)高位補(bǔ)0,有符號(hào)數(shù)高位補(bǔ)1,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言整形提升的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • C++語(yǔ)言基礎(chǔ) 命名空間

    C++語(yǔ)言基礎(chǔ) 命名空間

    一個(gè)中大型軟件往往由多名程序員共同開發(fā),會(huì)使用大量的變量和函數(shù),當(dāng)有兩個(gè)人都同時(shí)定義了一個(gè)名字相同的全局變量或函數(shù)的時(shí)候,若是把他們的代碼整合在一塊編譯,此時(shí)編譯器就會(huì)提示變量或函數(shù)重復(fù)定義,C++為了解決這個(gè)問(wèn)題,便引用了命名空間(namespace)的概念
    2020-01-01
  • C語(yǔ)言淺析函數(shù)的用法

    C語(yǔ)言淺析函數(shù)的用法

    C語(yǔ)言函數(shù)是用來(lái)模塊化構(gòu)建程序的。如果你的功能少,你可以全都寫在mian函數(shù)中,但是當(dāng)實(shí)現(xiàn)功能多的時(shí)候,如果全寫在main的函數(shù)里,不僅代碼不美觀,而且函數(shù)實(shí)現(xiàn)的時(shí)候結(jié)構(gòu)復(fù)雜,代碼重復(fù)
    2022-07-07
  • Qt輸入類控件用法超詳細(xì)講解

    Qt輸入類控件用法超詳細(xì)講解

    Qt是一個(gè)著名的GUI框架,用來(lái)開發(fā)和用戶交互的圖形界面,作為GUI框架,豐富的控件和靈活的事件機(jī)制是不可或缺的,Qt在這一方面做得非常優(yōu)秀,下面這篇文章主要給大家介紹了關(guān)于Qt輸入類控件用法的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • Python擴(kuò)展C/C++庫(kù)的方法(C轉(zhuǎn)換為Python)

    Python擴(kuò)展C/C++庫(kù)的方法(C轉(zhuǎn)換為Python)

    這篇文章主要介紹了Python擴(kuò)展C/C++庫(kù)的方法(C轉(zhuǎn)換為Python),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • C++ Cmake的構(gòu)建靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)詳解

    C++ Cmake的構(gòu)建靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)詳解

    這篇文章主要為大家詳細(xì)介紹了C++ Cmake的構(gòu)建靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03

最新評(píng)論

桦南县| 大同县| 枣庄市| 彩票| 黄梅县| 阆中市| 明溪县| 大方县| 漳州市| 雅江县| 西畴县| 庐江县| 吴江市| 锦州市| 环江| 岳阳县| 莆田市| 宜兴市| 康保县| 祁连县| 霸州市| 百色市| 勐海县| 曲阜市| 婺源县| 嘉义县| 兰考县| 庄浪县| 宁安市| 安阳市| 三都| 洪湖市| 丽江市| 东丰县| 巴中市| 东平县| 东兰县| 广宁县| 右玉县| 子洲县| 太白县|