欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1.淺拷貝

淺拷貝:對(duì)于有申請(qǐng)空間的對(duì)象的類(lèi)來(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類(lèi)對(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ì)象另開(kāi)一片空間,再把原對(duì)象空間上的值拷貝過(guò)來(lái),這樣在調(diào)用析構(gòu)函數(shù)的時(shí)候就不會(huì)產(chǎn)生沖突。

image-20220213125937937

image-20211119160705278

2.深拷貝

傳統(tǒng)寫(xiě)法的string類(lèi)的深拷貝是自己開(kāi)空間,自己將拷貝的對(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)代寫(xiě)法的string類(lèi)的深拷貝堪稱(chēng)是“移花接木”

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

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

VS 2013下的深拷貝

image-20220213130133785

g++下的深拷貝

image-20220213130200116

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

寫(xiě)時(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ì)象被銷(xiāo)毀時(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)文章

  • C語(yǔ)言堆棧幀的介紹與創(chuàng)建

    C語(yǔ)言堆棧幀的介紹與創(chuàng)建

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言堆棧幀的相關(guān)資料,堆棧幀 (stack frame)( 或活動(dòng)記錄 (activation Tecord)) 是一塊堆棧保留區(qū)域,用于存放被傳遞的實(shí)際參數(shù)、子程序的返回值、局部變量以及被保存的寄存器,需要的朋友可以參考下
    2021-08-08
  • c++ dynamic_cast與static_cast使用方法示例

    c++ dynamic_cast與static_cast使用方法示例

    本文用示例講解了dynamic_cast、static_cast子類(lèi)與基類(lèi)之間轉(zhuǎn)換功能的使用方法
    2013-11-11
  • c++實(shí)現(xiàn)排序算法之希爾排序方式

    c++實(shí)現(xiàn)排序算法之希爾排序方式

    這篇文章主要介紹了c++實(shí)現(xiàn)排序算法之希爾排序方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++中基類(lèi)和派生類(lèi)之間的轉(zhuǎn)換實(shí)例教程

    C++中基類(lèi)和派生類(lèi)之間的轉(zhuǎn)換實(shí)例教程

    這篇文章主要介紹了C++中基類(lèi)和派生類(lèi)之間的轉(zhuǎn)換,有助于深入理解C++面向?qū)ο蟪绦蛟O(shè)計(jì),需要的朋友可以參考下
    2014-08-08
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)先序、中序、后序及層次四種遍歷

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)先序、中序、后序及層次四種遍歷

    這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)二叉樹(shù)先序、中序、后序及層次四種遍歷方式,具有一定的知識(shí)性參考價(jià)值,需要的小伙伴可以先看一下
    2022-02-02
  • C++填坑的重寫(xiě),重載和隱藏的詳解

    C++填坑的重寫(xiě),重載和隱藏的詳解

    這篇文章主要介紹了C++中重載、重寫(xiě)(覆蓋)和隱藏的區(qū)別,是C++面向?qū)ο蟪绦蛟O(shè)計(jì)非常重要的概念,需要的朋友可以參考下,希望能夠給你帶來(lái)幫助
    2021-09-09
  • 詳解C++如何高效利用CPU緩存

    詳解C++如何高效利用CPU緩存

    高效利用CPU緩存是編寫(xiě)高性能C++代碼的關(guān)鍵之一,所以這篇文章小編主要來(lái)和大家介紹一下C++如何實(shí)現(xiàn)高效利用CPU緩存,需要的可以參考一下
    2024-02-02
  • Opencv實(shí)現(xiàn)圖像灰度線性變換

    Opencv實(shí)現(xiàn)圖像灰度線性變換

    這篇文章主要為大家詳細(xì)介紹了Opencv實(shí)現(xiàn)圖像灰度線性變換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • QT中如何讀寫(xiě)ini配置文件

    QT中如何讀寫(xiě)ini配置文件

    ini文件在windows系統(tǒng)中可以存儲(chǔ)需要持久保存的配置信息,QT界面中如何實(shí)現(xiàn)手動(dòng)讀取參數(shù)存放的位置,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++中4種類(lèi)型轉(zhuǎn)換的方法分享

    C++中4種類(lèi)型轉(zhuǎn)換的方法分享

    這篇文章主要為大家詳細(xì)介紹了C++中4種類(lèi)型轉(zhuǎn)換的方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定的幫助,感興趣的可以了解一下
    2023-04-04

最新評(píng)論