網站首頁 編程語言 正文
1.淺拷貝
淺拷貝:對于有申請空間的對象的類來說,是按照字節序依次拷貝過去的,并沒有另外申請一塊空間。因此,在調用析構函數的時候會造成同一塊空間釋放兩次的情況,從而使程序崩潰。
如下實例:
class string { public: string(const char* str) { //構造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); }
運行看看,報錯了
分析錯因:
淺拷貝是指向同一塊空間的,這樣就會有倆個無法避免的問題:
1.析構倆次空間,程序崩潰
2.其中一個的值被修改了,會影響到另外一個的值。
深拷貝:給每個對象單獨分配資源,就是給待拷貝的對象另開一片空間,再把原對象空間上的值拷貝過來,這樣在調用析構函數的時候就不會產生沖突。
2.深拷貝
傳統寫法的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; }
現代寫法的string類的深拷貝堪稱是“移花接木”
string(const string& s) :_str(nullptr)//必須置空,因為_str開始是個隨機數,交換給tmp._str后,釋放會引起問題 { string tmp(s._str);//直接利用構造函數,給tmp對象開辟了一塊空間 swap(tmp); } string& operator=(string s) { swap(s);//這個swap是咱們自己寫的哦 return *this; }
順帶提一嘴,各個編譯器深拷貝的底層實現略有差異(當然邏輯是一樣的)
VS 2013下的深拷貝
g++下的深拷貝
3.引用計數+寫時拷貝
寫時拷貝就是一種拖延癥, 是在淺拷貝的基礎之上增加了引用計數的方式來實現的。
引用計數:用來記錄資源使用者的個數。在構造時,將資源的計數給成1,每增加一個對象使用該資源,就給計數增加1,當某個對象被銷毀時,先給該計數減1,然后再檢查是否需要釋放資源,如果計數為1,說明該對象時資源的最后一個使用者, 將該資源釋放;否則就不能釋放,因為還有其他對象在使用該資源。
總結
原文鏈接:https://blog.csdn.net/weixin_48953972/article/details/123566160
相關推薦
- 2022-06-16 Python實現視頻下載與合成的示例代碼_python
- 2022-09-21 Django中外鍵使用總結_python
- 2022-09-25 ubuntu 20.04 開機黑屏小橫杠和循環登錄
- 2023-07-09 echarts飄警告[ECharts] There is a chart instance alre
- 2023-01-19 C#實現身份證驗證功能的示例代碼_C#教程
- 2022-07-13 查看工具設置的編碼 sys.getdefaultencoding()
- 2023-11-12 python 將兩個或者多個字符串進行拼接
- 2022-05-23 vmware增加新硬盤無需重啟即可生效的命令腳本_VMware
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支