c++深拷貝和淺拷貝

一、淺拷貝

  • 本質:簡單地復制對象的成員值。如果成員里有指針,新對象和原對象的指針會指向同一塊內存
    比如你有對象?A,里面指針?p?指向堆內存?0x123;用?A?拷貝出對象?BB?的指針?p?也指向?0x123

  • 問題

    • 若其中一個對象修改指針指向的內容,另一個對象也會受影響(因為共享內存)。
    • 當對象銷毀時(調用析構函數),兩個對象的指針會重復釋放同一塊內存,程序會崩潰(C++ 不允許重復釋放同一塊堆內存 )。

    類比:你和朋友共用一把家里的鑰匙(指針),你把家里東西改了(修改內存內容),朋友看到的也會變;但如果你們先后 “銷毀鑰匙權限”(調用析構釋放內存),第二次釋放就會出問題。

二、深拷貝

  • 本質:給新對象的指針重新開一塊獨立的堆內存,再把原對象指針指向的內容完整復制到新內存里。
    還是用上面的例子:對象?A?指針?p?指向?0x123;拷貝出對象?B?時,B?會新申請一塊內存?0x456,再把?0x123?里的內容復制到?0x456B?的指針?p?指向?0x456

  • 優點

    • 兩個對象的指針各自指向獨立內存,修改內容互不影響。
    • 析構時,各自釋放自己的內存,不會重復釋放,程序更安全。

    類比:你和朋友各自配一把鑰匙(新內存),各自鑰匙開各自家門(獨立內存),改自己家東西不影響對方,銷毀鑰匙(析構)也不會沖突。

三、如何實現深拷貝?(以代碼為例)

假設我們有一個簡單的?STRING?類(簡化版,類似你提供的代碼):

cpp

運行

class STRING {
private:char* _str;  // 指向堆內存的指針
public:// 構造函數:初始化字符串STRING(const char* str) {_str = new char[strlen(str) + 1];  // 開堆內存存字符串strcpy(_str, str);}// 析構函數:釋放堆內存~STRING() {delete[] _str;}// ... 其他成員函數
};
1. 深拷貝的拷貝構造函數

cpp

運行

STRING(const STRING& s) {// 1. 給新對象的指針開獨立堆內存(大小和原字符串一樣,+1 存 '\0')_str = new char[strlen(s._str) + 1];  // 2. 把原對象字符串內容,復制到新內存里strcpy(_str, s._str);  
}

作用:創建新對象時,不共用原對象內存,而是 “另開新內存 + 復制內容”,避免淺拷貝的問題。

2. 深拷貝的賦值運算符重載

cpp

運行

STRING& operator=(const STRING& s) {// 防御性檢查:避免自己賦值給自己(比如 a = a; 這種情況,釋放內存會出問題)if (this != &s) {  // 1. 先釋放當前對象舊的堆內存(防止內存泄漏)delete[] _str;  // 2. 開新內存,復制內容(和拷貝構造邏輯一樣)_str = new char[strlen(s._str) + 1];  strcpy(_str, s._str);  }return *this;  // 返回當前對象,支持鏈式賦值(比如 a = b = c; )
}

作用:處理 “對象賦值” 場景(比如?a = b;?)。需要先釋放自己舊的內存,再深拷貝新內容,否則會內存泄漏(舊內存沒釋放,又開新內存,原內存就丟了,無法釋放 )。

四、總結

  • 淺拷貝:簡單復制指針值,共享內存,容易出 “重復釋放” 或 “內容互相影響” 的問題。
  • 深拷貝:給新對象指針重新開內存、復制內容,讓對象互相獨立,解決淺拷貝的隱患。
  • 實現關鍵:在拷貝構造函數賦值運算符重載里,手動 “開新內存 + 復制內容”,別依賴編譯器默認的淺拷貝邏輯。

理解后,寫涉及指針成員(動態內存)的類時,記得補全深拷貝的這兩個函數,否則程序大概率會崩潰或內存泄漏~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90221.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90221.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90221.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NineData新增SQL Server到MySQL復制鏈路,高效助力異構數據庫遷移

在實際的數據庫遷移工作中,異構庫之間的遷移常常被視為一項“高風險、高工作量、高復雜度”的挑戰任務。這不僅是一次數據庫切換,更是對系統穩定性、數據一致性、業務連續性和技術團隊耐力的全方位考驗。為解決企業在異構數據庫遷移中的痛點,…

字符串和對象的深拷貝和淺拷貝

字符串和對象的深拷貝和淺拷貝【一】基本介紹【1】淺拷貝【2】深拷貝【二】字符串的拷貝【1】字符串的 “淺拷貝”【2】字符串的 “深拷貝”【三】對象的拷貝【1】淺拷貝(Shallow Copy)【2】深拷貝(Deep Copy)【四】字符串和對象拷…

4.5 優化器中常見的梯度下降算法

梯度下降算法(Gradient Descent)的數學公式可以通過以下步驟嚴格表達:1. 基本梯度下降(Batch Gradient Descent) 目標:最小化損失函數L(θ)\mathcal{L}(\theta)L(θ),其中 θ\thetaθ是模型參數…

AM1.5G AAA穩態太陽光模擬器特點

光譜匹配度AM1.5G AAA穩態太陽光模擬器的光譜分布嚴格匹配國際標準IEC 60904-9中的AM1.5G光譜(波長范圍300-4000nm),確保與自然太陽光的偏差在25%以內(AAA級標準)。光譜匹配度通過精密濾光片和氙燈或LED組合光源實現&a…

OSPF開放式最短路徑優先

1OSPF簡介(1)OSPF英文全稱Open Shortest Path First (開放式最短路徑優先)(2)OSPF是IETF 開發的一種鏈路狀態路由協議,使用基于帶寬的度量值。(3)OSPF采用SPF算法計算路由,從算法上保…

Lua(模塊與包)

Lua 模塊的基本概念Lua 中的模塊是一個由函數、變量組成的代碼庫,通常保存在獨立的 .lua 文件中。模塊通過 return 語句導出其內容,供其他腳本調用。模塊化設計可以提高代碼復用性,便于管理。創建模塊模塊通常以 .lua 文件形式存在&#xff0…

1. boost::asio之socket的創建和連接

網絡編程基本流程 網絡編程的基本流程對于服務端是這樣的 服務端 1)socket——創建socket對象。 2)bind——綁定本機ipport。 3)listen——監聽來電,若在監聽到來電,則建立起連接。 4)accept——再創建一個…

WPF 控制動畫開關

記錄一種實現方式:第一步:首先定義一個靜態類,提供依賴屬性,進而方便在xaml中實現綁定:public static class AnimationBehavior{// 定義附加屬性public static readonly DependencyProperty IsAnimatingProperty Depen…

元素豎向的百分比設定是相對于父容器的高度嗎?

元素豎向的百分比設定是相對于父容器的高度嗎? 核心問題 在CSS中,當設置元素的豎向屬性(如height、padding-top等)為百分比值時,其計算基準是父容器的高度還是寬度? 權威結論height屬性 百分比值基于父容器…

web3.0怎么入局

Web3.0(第三代互聯網)融合了區塊鏈、去中心化應用(DApps)、NFT、DAO等新興技術,給個人和機構提供了許多全新的賺錢機會。入局 Web3.0 賺錢主要有以下幾種途徑,根據你的技術背景、資金能力和時間投入可以選擇適合自己的方式。 目錄 一、普通用戶賺錢方式(門檻低) 1. …

linux入門 相關linux系統操作命令(二)--文件管理系統 ubuntu22.04

以下有免費的4090云主機提供ubuntu22.04系統的其他入門實踐操作 地址:星宇科技 | GPU服務器 高性能云主機 云服務器-登錄 相關兌換碼星宇社區---4090算力卡免費體驗、共享開發社區-CSDN博客 兌換碼要是過期了,可以私信我獲取最新兌換碼!&a…

Python-初學openCV——圖像預處理(二)

目錄 一、圖像仿射變換 1、基本性質 二、cv2.warpAffine() 函數 1、圖像旋轉 2、圖像平移 3、圖像縮放 4、圖像剪切 三、 插值方法 1、最近鄰插值 2、雙線性插值 3、像素區域插值 4、雙三次插值 5、Lanczos插值 一、圖像仿射變換 仿射變換(Affine Tr…

醫療AI輕量化部署方案的深度梳理與優化路徑判研

摘要 醫療AI的快速發展為精準診斷、個性化治療和醫療資源優化提供了新機遇。然而,大規模模型的高計算復雜度和資源需求限制了其在資源受限環境(如邊緣設備、基層醫療機構)的應用。本文系統梳理了醫療AI輕量化部署的核心技術體系,包括模型壓縮、參數高效微調(PEFT)、邊緣-…

SSP通過SDK對接流量的原理與實現

一、核心概念解析 1.1 SSP(供應方平臺) 定義:SSP是程序化廣告生態中媒體方的核心工具,通過自動化技術幫助媒體(如網站、應用、視頻平臺)管理廣告資源、優化填充率并最大化廣告收益。核心功能:…

如何清理電腦c盤內存 詳細操作步驟

電腦使用時間不斷延長,許多用戶可能會遇到一個問題——C盤空間不足,導致系統運行緩慢或無法安裝新程序。如果C盤的存儲空間被大量占用,可能會影響到計算機的性能。本文將介紹幾種有效的方法,幫助你清理C盤內存,釋放空間…

ESP32的ADF詳解:5. Streams的API

一、算法流 (algorithm stream) 1. 初始化與配置API功能描述關鍵參數說明algo_stream_init()初始化算法流(AEC/AGC/NS/VAD)config->algo_mask 選擇算法組合config->sample_rate 設置采樣率(默認16kHz)config->partition_…

JavaScript對象鍵序問題解析

問題的發現: 我有一個接口返回一個json數據瀏覽器network里的Response里是從大到小排。 但Preview就是反過來的 問題的描述: 上面那個讓我發現瀏覽器處理對象或者json是會對其鍵值對做排序!!! 在JavaScript中&am…

pandas庫的數據導入導出,缺失值,重復值處理和數據篩選,matplotlib庫 簡單圖繪制

目錄 一.數據導入導出 1.CSV文件讀取與參數說明 2.Excel與TST文件讀取 3.數據導出操作 二.缺失值處理 1.填充缺失值 2.刪除缺失值【刪除整行數據】 三.重復值處理 四.數據篩選與條件查詢 1.邏輯判斷取數 2.字符匹配 3.邏輯運算: &(和&…

FPGA?如何實現另一個?FPGA?

如果你對 FPGA 有些了解,大概知道它的意思是“可編程邏輯器件”,可以把寫好的邏輯電路(通常是 Verilog/VHDL)通過工具綜合、布局布線、燒寫進去,讓一塊芯片變成“你想要的電路”。但如果我告訴你,現在有個開…

文思助手、新華妙筆 AI材料星的公文寫作深度測評

公文寫作一直都是體制內工作人員的日常核心任務,寫公文的難點不僅來自于對政策表述嚴謹性的高要求,也在于格式規范、內容深度以及效率壓力的多重考驗。隨著AI技術的發展,越來越多的文字輔助工具出現,很大程度的緩解了寫作壓力&…