亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++的深淺拷貝和寫時拷貝你了解嗎

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

1.淺拷貝

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

如下實例:

class string
{
public:
	string(const char* str)
	{
		//構(gòu)造string類對象時,如果傳遞nullptr指針
		//認為程序非法,此處斷言下
		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);
}

運行看看,報錯了

image-20211119153738386

分析錯因:

image-20211119155522526

image-20211119160321325

淺拷貝是指向同一塊空間的,這樣就會有倆個無法避免的問題:

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

2.其中一個的值被修改了,會影響到另外一個的值。

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

image-20220213125937937

image-20211119160705278

2.深拷貝

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

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)//必須置空,因為_str開始是個隨機數(shù),交換給tmp._str后,釋放會引起問題
{
	string tmp(s._str);//直接利用構(gòu)造函數(shù),給tmp對象開辟了一塊空間
	swap(tmp);
}
string& operator=(string s)
{
	swap(s);//這個swap是咱們自己寫的哦
	return *this;
}

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

VS 2013下的深拷貝

image-20220213130133785

g++下的深拷貝

image-20220213130200116

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

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

引用計數(shù):用來記錄資源使用者的個數(shù)。在構(gòu)造時,將資源的計數(shù)給成1,每增加一個對象使用該資源,就給計數(shù)增加1,當某個對象被銷毀時,先給該計數(shù)減1,然后再檢查是否需要釋放資源,如果計數(shù)為1,說明該對象時資源的最后一個使用者, 將該資源釋放;否則就不能釋放,因為還有其他對象在使用該資源。

image-20220213130242526

總結(jié)

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

    C++填坑的重寫,重載和隱藏的詳解

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

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

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

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

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

    QT中如何讀寫ini配置文件

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

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

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

最新評論