【C++】內存分布、new、delete、 operator new、operator delete

內存分布

在C語言和C++中,程序內存被劃分成六個部分:

內核空間、棧、內存映射段、堆、數據段、代碼段

棧:又稱堆棧,主要為非靜態局部變量、函數參數、返回值等,棧的生長方向是向下生長

內存映射段:高效的I/O映射方式,用于裝載一個共享的動態內存庫。用戶可以使用系統接口創建共享內存,用做進程間通信

堆:用于程序運行時的動態內存分配,堆的生長方向是向上生長

數據段:儲存全局數據和靜態數據

代碼段:儲存可執行的代碼、只讀常量(const)


new、delete

?new與malloc函數等C語言中開辟空間的操作不同的是,new不需要自行計算空間大小和返回類型,同時在使用new進行自定義類型的空間開辟時,它會自動調用默認構造函數完成初始化

delete與free等不同之處在于:delete會自動調用自定義類型的析構函數

在申請自定義類型的空間時,new會調用構造函數,delete會調用析構函數,而malloc與 free不會

申請和釋放單個元素的空間,使用newdelete操作符

申請和釋放連續的空間,使用 new[]delete[]


?operator new與operator delete

operator new和operator delete為系統定義的全局函數

new和delete在底層分別調用了operator new和operator delete用來申請和釋放空間

operator new實際通過malloc來申請空間,當malloc申請成功時直接返回,失敗時拋異常

operator delete實際通過free來釋放空間,成功時直接返回,失敗時返回NULL

new的原理:先用operator new申請空間,在申請的空間上執行構造函數,完成對象的構造

delete的原理:在申請的空間上執行析構函數,完成對象的資源清理,再用operator delete釋放空間

new T[N]的原理:先用operator new[]函數,在operator new[]中實際調用operator new函數完成N個對象空間的申請,再在申請的空間上執行N次構造函數

delete[]的原理:先在釋放的對象空間上執行N次析構函數,完成N個對象中資源的清理,再調用operator delete[]釋放空間,實際在operator delete[]中調用operator delete來釋放空間


?malloc/free與new/delete的區別

共同點:都是從堆上申請空間,需要用戶手動釋放空間

不同點:1.malloc與free為函數,new與delete為操作符

2.malloc申請的空間不會初始化,new會初始化

3.malloc申請空間時需要手動計算空間大小并傳遞,new只需要在后面跟上空間的類型,若是申請多個對象,[]中指定對象個數即可

4.malloc返回值為void*,必須強制類型轉化,new不需要

5.malloc申請空間失敗時返回的NULL,使用時必須判空,new不需要判空但必須捕獲異常

6.申請自定義類型對象時,new/delete會執行默認的構造函數和析構函數,完成對象的初始化或資源釋放,而malloc/free不會

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

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

相關文章

代碼隨想錄算法訓練營day37|動態規劃part5

今天的幾道題目都比較簡單,思路也比較相似,都是利用完全背包。完全背包和01背包的不同點在于完全背包每個元素可以取多次,而01背包只能取1次,所以在dp一維數組遍歷時,完全背包仍然要從前往后遍歷,并且無論是…

混合云策略在安全領域受到青睞

Genetec 發布了《2025 年物理安全狀況報告》,該報告根據超過 5,600 名該領域領導者(其中包括 100 多名來自澳大利亞和新西蘭的領導者)的回應,揭示了物理安全運營的趨勢。 報告發現,澳大利亞和新西蘭的組織采用混合云策…

FastAPI解決跨域報錯net::ERR_FAILED 200 (OK)

目錄 一、跨域問題的本質 二、FastAPI中的CORS處理 1. 安裝FastAPI和CORS中間件 2. 配置CORS中間件 3. 運行FastAPI應用 三、解決跨域報錯的步驟 四、案例:解決Vue.js與FastAPI的跨域問題 1. Vue.js前端應用 2. FastAPI后端API 3. 配置CORS中間件 4. 運行和測試 五…

為什么 JavaScript 中的 `new` 運算符報錯?

在 JavaScript 中,new 運算符通常用于創建一個新對象并調用構造函數來初始化對象。然而,new 運算符可能會引發一些錯誤,通常是由于以下原因導致的: 構造函數沒有正確的定義: 如果使用 new 運算符調用的函數沒有正確地定…

霍爾效應電流傳感器

適用于大電流,低功耗的電流檢測: TVS選型: RS232的隔離電路: 單片機采集200伏高壓 如何做隔離電路: 采用線性光電耦合器HCNR200實現高壓直流母線電壓的精確采樣。還是用電阻分壓,只是在ADC檢測階段加上隔離芯片:

如何設置Java爬蟲的異常處理?

在Java爬蟲中設置異常處理是非常重要的,因為網絡請求可能會遇到各種問題,如連接超時、服務器錯誤、網絡中斷等。通過合理的異常處理,可以確保爬蟲的穩定性和健壯性。以下是如何在Java爬蟲中設置異常處理的步驟和最佳實踐: 1. 使用…

ceph /etc/ceph-csi-config/config.json: no such file or directory

環境 rook-ceph 部署的 ceph。 問題 kubectl describe pod dragonfly-redis-master-0Warning FailedMount 7m59s (x20 over 46m) kubelet MountVolume.MountDevice failed for volume "pvc-c63e159a-c940-4001-bf0d-e6141634cc55" : rpc error: cod…

【計網筆記】習題

物理層 不屬于物理層接口規范定義范疇的是(C) A. 接口形狀 B. 引腳功能 C. 物理地址 D. 信號電平 【2023-912】光網絡只能通過導向型介質傳播。() 【2017-408】若信道在無噪聲情況下的極限數據傳輸速率不小于信噪比為30dB條件下的…

最新 AI 編程工具全面對比:v0、Bolt.new、Cursor、Windsurf

隨著人工智能的快速發展,越來越多的 AI 驅動的開發工具應運而生,旨在提升開發效率、優化開發流程,并減輕開發者的工作負擔。在這個背景下,四款新興的 AI 編程工具:v0、Bolt.new、Cursor 和 Windsurf,各具特…

【C++算法】35.位運算_兩整數之和

文章目錄 題目鏈接:題目描述:解法C 算法代碼: 題目鏈接: 371. 兩整數之和 題目描述: 解法 筆試的話直接 return ab; 接下來講一下這題的解法: 位運算(異或運算-無進位相加&#xff…

PyCharm+Selenium+Pytest配置小記

1、下載ChromeDriver: Chrome130以后的Driver下載: Chrome for Testing availabilityhttps://googlechromelabs.github.io/chrome-for-testing/ (1)查看自己Crome瀏覽器的版本:設置-->關于 Chrome; &…

【C++】虛函數

類中聲明函數成員的時候,在函數的前面加上virtual關鍵字,則該成員為虛函數 虛函數的特點 如果在類中定義的虛函數,那么系統會為這個類維護一個虛函數表類中會多出4個字節的指針去指向這個虛函數表,在虛函數表中保存了虛函數的首…

如何在UI自動化測試中創建穩定的定位器?

如何在UI自動化測試中創建穩定的定位器? 前言1. 避免使用絕對路徑2. 避免在定位器中使用索引3. 避免多個類名的定位器4. 避免動態和自動生成的ID5. 確保定位器唯一6. 處理隱藏元素的策略7. 謹慎使用基于文本的定位器8. 使用AI創建穩定的定位器 總結 前言 在自動化測…

明日宣講 香港科技大學廣州|數據科學與分析學域碩博招生宣講會【湖南大學專場】

📣📣📣明日宣講 香港科技大學廣州|數據科學與分析學域碩博招生宣講會【湖南大學專場】 時間:2024年12月10日(星期二)15:00 地點:湖南大學信息科學與工程學院624會議室 報名鏈接&…

BurpSuite-8(FakeIP與爬蟲審計)

聲明:學習視頻來自b站up主 瀧羽sec,如涉及侵權馬上刪除文章 感謝瀧羽sec 團隊的教學 視頻地址:IP偽造和爬蟲審計_嗶哩嗶哩_bilibili 一、FakeIP 1.配置環境 BurpSuite是java環境下編寫的,而今天的插件是python編寫的&#xff0c…

2024 一帶一路暨金磚國家技能發展與技術創新大賽【網絡安全防護治理實戰技能賽項】樣題(中職組)

2024 一帶一路暨金磚國家技能發展與技術創新大賽【網絡安全防護治理實戰技能賽項】樣題(中職組) 1.基礎設置和安全強化(xxx 分)1.3. 任務內容: 2.安全監測和預警(xxx 分)2.1. 任務一:建立目錄安…

Qt C++ 顯示多級結構體,包括結構體名、變量名和值

文章目錄 mainwindow.hmainwindow.cppstructures.hmain.cpp QTreeView 和 QStandardItemModel 來實現。以下是實現這一功能的步驟和示例代碼: 定義多級結構體: 假設你有一個多級結構體,如下所示: struct SubStruct {int subValue…

CISC和RISC的區別

CISC是什么 CISC是一種指令集設計方式,全程叫復雜指令集,這種指令設計模式包含大量的復雜指令和復雜的尋址方式, 以下是CISC架構的一些主要特點: 豐富的指令集:CISC處理器通常包含大量的指令,這些指令覆蓋…

20 設計模式之職責鏈模式(問題處理案例)

一、什么是職責鏈模式 職責鏈模式是一種行為型設計模式,它允許將請求沿著處理者的鏈進行傳遞,直到有一個處理者能夠處理它為止。換句話說,它將請求的發送者和接收者解耦,使得多個對象都有機會處理這個請求,從而避免了將…

linux基于systemd自啟守護進程 systemctl自定義服務傻瓜式教程

系統服務 書接上文: linux自啟任務詳解 演示系統:ubuntu 20.04 開發部署項目的時候常常有這樣的場景: 業務功能以后臺服務的形式提供,部署完成后可以隨著系統的重啟而自動啟動;服務異常掛掉后可以再次拉起 這個功能在ubuntu系統中通常由systemd提供 如果僅僅需要達成上述的場…