C++動態內存的管理

今天來分享C++動態內存管理相關知識,閑言勿談,直接上干貨。

1. 動態內存的開辟和銷毀(new和delete)

(1)前置知識:我們知道c語言有malloc和calloc和realloc三個函數可以進行動態的開辟內存,那么它們有什么區別呢?首先是malloc,malloc表示直接在堆上動態開辟內存空間,返回void*,而calloc不僅可以直接在堆上動態開辟內存空間,還會把開辟空間的內容初始化為0,calloc返回的也是void*,realloc是在原有的空間的基礎上進行擴容,也是返回void*.c語言雖然有三個動態開辟內存的函數,但在某些場景下不適用,同時用起來也比較麻煩,所以c++引入了一個new操作符進行動態開辟內存,delete操作符進行銷毀開辟的內存,那么接下來我們看看new的用法吧。

(2)new和delete用法

new和delete操作符對內置類型進行開辟空間

new和malloc對于內置類型開辟空間,功能都差不多。

int main()
{//表示在堆上申請一個int空間int* p1 = new int;delete p1;//表示在堆上申請一個int空間并初始化為4int* p2 = new int(4);delete p2;//表示在堆上申請3個int空間int* p3 = new int[3];delete[] p3;return 0;
}

在這里插入圖片描述

new和delete操作符對自定義類型進行開辟空間

我們來看看new和malloc對于自定義類型開辟空間的不同之處。

class A
{
public:A(int a = 0): _a(a){cout << "A():" << this << endl;}~A(){cout << "~A():" << this << endl;}
private:int _a;
};int main()
{A* p1 = (A*)malloc(sizeof(A));A* p2 = new A;free(p1);delete p2;return 0;
}

我們來看看這個代碼運行的結果

在這里插入圖片描述
咋出現了調用構造函數和析構函數呢?是誰調用的呢?
我們把malloc和free的函數進行注釋掉,如果還調用構造函數和析構函數,那么證明是new和delete調用的構造函數和析構函數。

class A
{
public:A(int a = 0): _a(a){cout << "A():" << this << endl;}~A(){cout << "~A():" << this << endl;}
private:int _a;
};int main()
{/*A* p1 = (A*)malloc(sizeof(A));*/A* p2 = new A;//free(p1);delete p2;return 0;
}

在這里插入圖片描述
還是調用了構造函數和析構函數,現在我們就清楚了malloc函數和new操作符,free函數和delete操作符之間的區別是,new開辟空間是會調用構造函數進行初始化,delete在釋放空間是會調用析構函數對對象中的資源進行清理。

(2)operator new函數和operator delete函數

我們先來看看c++標準庫里面是如何實現operator new和operator delete函數的。
在這里插入圖片描述在這里插入圖片描述

我們可以看到operator new和operator delete是依靠malloc和free函數實現的,該函數實際通過malloc來申請空間,當malloc申請空間成功時直接返回;申請空間失敗,嘗試執行空間不足應對措施,如果改應對措施用戶設置了,則繼續申請,否則拋異常。

new和delete實現的原理

(1)對于內置類型,new和malloc功能相似,delete和free功能相似。

(1)對于自定義類型

new不僅調用operator new函數開辟空間還會調用構造函數。
delete不僅會調用operator delete函數釋放空間,還會調用析構函數完成對對象資源的清理工作

總結:

1.共同點:malloc和new都是在堆上開辟空間,都需要手動釋放開辟的空間
2.不同點:malloc和free是函數,new和delete是操作符(概念性質不同)
malloc開辟空間是要傳需要開辟的字節數,返回的是void*;而new后跟申請對象的類型,返回的是申
請對象的類型的指針
new會調用構造函數,開辟失敗會拋異常,malloc開辟失敗會返回0

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

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

相關文章

MPS 后端

本文來自&#xff1a; https://pytorch.org/docs/stable/notes/mps.html https://pytorch.ac.cn/docs/stable/notes/mps.html MPS 后端 mps 設備支持 在使用 Metal 編程框架的 MacOS 設備上&#xff0c;進行高性能 GPU 訓練。 它引入了新的設備&#xff0c;將機器學習計算圖和…

【C語言】條件運算符詳解 - 《 A ? B : C 》

目錄 C語言條件運算符詳解1. 條件運算符的語法和使用示例 1&#xff1a;基本用法輸出 2. 嵌套條件運算符示例 2&#xff1a;嵌套條件運算符輸出 3. 條件運算符與 if-else 語句的比較示例 3&#xff1a;使用 if-else 語句示例 4&#xff1a;使用條件運算符 4. 條件運算符的實際應…

PLC_博圖系列?基本指令”TONR:時間累加器“

PLC_博圖系列?基本指令”TONR&#xff1a;時間累加器“ 文章目錄 PLC_博圖系列?基本指令”TONR&#xff1a;時間累加器“背景介紹TONR&#xff1a; 時間累加器說明參數脈沖時序圖示例 關鍵字&#xff1a; PLC、 西門子、 博圖、 Siemens 、 TONR 背景介紹 這是一篇關于P…

ElasticSearch學習之路

前言 為什么學ElasticSearch&#xff1f; 數據一般有如下三種類型&#xff1a; 結構化數據&#xff0c;如&#xff1a;MySQL的表&#xff0c;一般通過索引提高查詢效率非結構化數據&#xff0c;如&#xff1a;圖片、音頻等不能用表結構表示的數據&#xff0c;一般保存到mong…

Linux C++ 054-設計模式之外觀模式

Linux C 054-設計模式之外觀模式 本節關鍵字&#xff1a;Linux、C、設計模式、外觀模式 相關庫函數&#xff1a; 概念 外觀模式&#xff08;Facade&#xff09;&#xff0c;亦稱“過程模式”。主張按照描述和判斷資料來評價課程&#xff0c;關鍵的活動是在課程實施的全過程中…

昇思25天學習打卡營第24天|基于MindSpore的Diffusion擴散模型

Diffusion擴散模型 本文基于Hugging Face&#xff1a;The Annotated Diffusion Model一文翻譯遷移而來&#xff0c;同時參考了由淺入深了解Diffusion Model一文。 關于擴散模型&#xff08;Diffusion Models&#xff09;有很多種理解&#xff0c;本文的介紹是基于denoising di…

基礎動態規劃題目基礎動態規劃題目

目錄 題目1&#xff1a; P1216 [USACO1.5] [IOI1994]數字三角形 Number Triangles 代碼示例&#xff1a; 題目2&#xff1a; Common Subsequence 代碼示例 題目3 &#xff1a;最長上升子序列 最長不下降子序列 最長上升子序列oj答案 題目1&#xff1a; P1216 [USACO1.5]…

SQL面試題練習 —— 查詢每個用戶最大連續登錄天數

目錄 1 題目2 建表語句3 題解 1 題目 查詢每個用戶最大連續登錄天數 樣例數據如下 login_log&#xff1a; 2 建表語句 --建表語句 create table if not exists login_log (user_id int comment 用戶id,login_time date comment 登錄時間 ); --數據插入 INSERT overwrit…

Matlab進階繪圖第63期—帶標記線的三維填充折線圖

三維填充折線圖是在三維折線圖的基礎上&#xff0c;對其與XOY平面之間的部分進行顏色填充&#xff0c;從而能夠更好地刻畫細節變化。 而帶標記線的三維填充折線圖是在其基礎上&#xff0c;添加X相同的一條或多條標記線&#xff0c;以用于進一步討論分析。 由于Matlab中未收錄…

飛睿智能UWB Tag藍牙防丟器標簽,寵物安全新升級,5cm精準定位測距不迷路

寵物早已成為許多家庭不可或缺的一員&#xff0c;它們用無條件的愛溫暖著我們的心房&#xff0c;陪伴我們度過每一個平凡而溫馨的日子。然而&#xff0c;隨著寵物活動范圍的擴大和外界環境的復雜多變&#xff0c;寵物走失的風險也隨之增加。每一次出門遛彎&#xff0c;都像是心…

【學術會議征稿】第六屆光電材料與器件國際學術會議(ICOMD 2024)

第六屆光電材料與器件國際學術會議&#xff08;ICOMD 2024&#xff09; 2024 6th International Conference on Optoelectronic Materials and Devices 第六屆光電材料與器件國際學術會議&#xff08;ICOMD 2024&#xff09;將于2024年11月1-3日在中國重慶召開。 大會面向基…

Windows與Ubuntu安裝ffmpeg

文章目錄 前言ffmpeg的簡介安裝ffmpegWindows下載設置環境變量 Ubuntu 總結 前言 FFmpeg是一款非常強大的開源音視頻處理工具&#xff0c;它包含了眾多的音視頻編解碼庫&#xff0c;可以用于音視頻的采集、編解碼、轉碼、流化、過濾和播放等復雜的處理。在Windows系統上安裝FF…

【Android14 ShellTransitions】(七)Transition就緒

Transition.onTransactionReady的內容比較長&#xff0c;我們挑重點的部分逐段分析&#xff08;跳過的地方并非不重要&#xff0c;而是我柿子挑軟的捏&#xff09;。 1 窗口繪制狀態的流轉以及顯示SurfaceControl 注意我們這里的SurfaceControl特指的是WindowSurfaceControll…

Laravel API資源全解析:打造高效響應的秘訣

Laravel API資源全解析&#xff1a;打造高效響應的秘訣 在構建RESTful API時&#xff0c;資源的表示和管理是核心部分。Laravel框架通過API資源&#xff08;API Resources&#xff09;提供了一種優雅的方式來格式化和轉換模型數據&#xff0c;以適應API的響應需求。本文將深入…

Flink底層原理解析:案例解析(第37天)

系列文章目錄 一、flink架構 二、Flink底層原理解析 三、Flink應用場景解析 四、fink入門案例解析 文章目錄 系列文章目錄前言一、flink架構1. 作業管理器&#xff08;JobManager&#xff09;2. 資源管理器&#xff08;ResourceManager&#xff09;3. 任務管理器&#xff08;Ta…

Laravel的魔法面具:深入解析門面(Facades)的神秘力量

Laravel的魔法面具&#xff1a;深入解析門面&#xff08;Facades&#xff09;的神秘力量 在Laravel的世界中&#xff0c;門面&#xff08;Facades&#xff09;是一種將類靜態方法調用轉換為動態方法調用的機制。它們提供了一種優雅的方式來與底層的Laravel服務容器進行交互&am…

Baum-Welch算法,也被稱為前向-后向算法,是一種用于訓練隱馬爾可夫模型(Hidden Markov Model, HMM)的重要算法。

Baum-Welch算法詳解與Python代碼示例 一、算法詳解 Baum-Welch算法&#xff0c;也被稱為前向-后向算法&#xff0c;是一種用于訓練隱馬爾可夫模型&#xff08;Hidden Markov Model, HMM&#xff09;的重要算法。HMM是一種統計模型&#xff0c;用于描述一個含有隱含未知參數的…

Java中創建對象的幾種方式

Java中創建對象的幾種方式 1. 使用new關鍵字 這是最直接、最常見的創建對象的方式。通過new關鍵字&#xff0c;Java會調用類的構造函數&#xff08;Constructor&#xff09;來初始化新創建的對象。 ClassName obj new ClassName();2. 使用clone()方法 如果類實現了Cloneab…

JavaScript統計字符串中出現次數最多的字符

思路&#xff1a;使用charAt()方法可以通過for循環來依次遍歷出字符串中的字符 將遍歷出來的字符作為一個空對象的屬性 如果該對象中該屬性沒有值則對其賦值為1 如果該對象中已經有值了則在原基礎上加1 最后通過for in循環比較對象中個屬性值大大小然后將其打印出來 <!DOCT…

liunx面試題目

如何看當前Linux系統有幾顆物理CPU和每顆CPU的核數&#xff1f; 查看物理cup&#xff1a; cat /proc/cpuinfo|grep -c ‘physical id’ 查看每顆cup核數 cat /proc/cpuinfo|grep -c ‘processor’ 若希望自動實現軟件包的更新&#xff0c;可以使用yum-cron并啟動該服務 yum -y …