內存管理(1)

內存管理(1)

  • 1、各類型數據在內存中的存儲空間
  • 2、C++內存管理方式
    • 2.1 針對于內置類型分析
    • 2.2 針對于自定義類型分析
    • 2.3 C語言與C++在申請動態內存失敗時的區別
  • 3、operator new 和 operator delete函數(重點)
    • 3.1 底層知識解析
    • 3.2 實現專屬operator new 與 operator delete (了解)

1、各類型數據在內存中的存儲空間

int globalVar = 1;
static int staticGlobalVar = 1;void Test()
{static int staticVar = 1;int localVar = 1;int num1[10] = {1,2,3,4};char char2[] = "abcd";  //常量數據需要在外面加 " "const char* pChar3 = "abcd";int* ptr1 = (int*)malloc(sizeof(int)*4);int* ptr2 = (int*)calloc(4,sizeof(int));int* ptr3 = (int*)realloc(ptr2,sizeof(int)*4);free(ptr1);free(ptr2);
}//(1) globalVar  數據段 ;                         staticGlobalVar  數據段;    staticVar 數據段;
//    localVar   棧區   ;                         num1   棧區
//    char2(數組名\數組首元素地址)  棧區;       *char2  代碼段
//    pChar3(指針) 棧區;                        *pChar3  代碼段
//    ptr1(指針)   棧區;                        *ptr1   堆區
//

2、C++內存管理方式

// C語言內存管理方式在C++中可以繼續使用,但有些地方就無能為力,而使用起來比較麻煩,因此C++又提出了自己的內存管理方式:通過new和delete
// 操作符進行動態內存管理。

2.1 針對于內置類型分析

void Test()
{int* p1 = (int*)malloc(sizeof(int));int* p2 = new int;//申請具有5個int的數組int* p3 = new int[5];//申請1個int的數組,并初始化為5int* p4 = new int(5);//C++11支持new[] 用{}初始化  C++98不支持//將申請具有5個int的數組 進行初始化int* p5 = new int[5]{1,2,3};free(p1);delete p2;delete[] p3;delete p4;delete[] p5;//針對內置類型,new/delete 跟 malloc/free沒有本質的區別,只有用法的區別。// new/delete 用法簡化了。
}int main()
{Test();return 0;
}

2.2 針對于自定義類型分析

class A
{
public:A(int a):_a(a){cout<<"A():"<< this << endl;}~A(){cout<< "~A():" <<this << endl;}private:int _a;
};int main()
{//堆上申請空間A* p1=(A*)malloc(sizeof(A));if (0==p1){perror("malloc fail");return 0;}//1、堆上申請空間  2、調用構造函數進行初始化A* p2 = new A;   //調用默認構造函數A* p2 = new A(10); //調用非默認構造函數//申請10個A類型對象的空間,并進行初始化A* p3 = new A[5]{1,2,3,4,5};delete[] p3;  //數組里的對象,先初始化后析構//釋放空間free(p1);//1、調用 析構函數 清理對象中資源  2、釋放空間delete p2;//結論: new/delete 是為自定義類型準備的;//不僅在堆上申請出來,還會調用構造函數和析構函數進行初始化和清理。//注意:new/delete  new[]/delete[]一定要匹配使用,否則可能會出問題。return 0;
}

2.3 C語言與C++在申請動態內存失敗時的區別

int main()
{// malloc失敗返回NULLchar* p1 = (char*)malloc(1024u * 1024u * 1024u * 2 - 1);printf("%p\n",p1);// new失敗,不需要檢查返回值,它失敗是拋異常(異常:是面向對象語言出錯處理的方式)try{//char* p2 = new char[1024u * 1024u * 1024u*2-1];char* p2 = (char*)operator new(1024u * 1024u * 1024u);printf("%p\n", p2);operator delete(p2);}//當申請空間失敗時,才會進入catch; 若申請空間成功時,就會跳過catch;catch (const exception& e){cout<< e.what() <<endl;}return 0;
}

3、operator new 和 operator delete函數(重點)

3.1 底層知識解析

// new和delete 是用戶進行動態內存申請和釋放的操作符。operator new 和 operator delete是系統提供的全局函數,new在底層調用operator new全局函數來
// 申請空間,delete在底層通過operator delete全局函數來釋放空間。
//
// operator new全局函數——幫助new開空間——(封裝)調用malloc{ 若malloc失敗了,符合C++ new的失敗機制(失敗拋異常)}。 
// operator delete全局函數——幫助delete釋放空間——(封裝)調用free 
//
// new的底層分為兩部分:調用operator new +  調用構造函數; 即:new Type(自定義類型) --> call  operator new【調用malloc(若開辟空間失敗,會拋異常)】 +  call Type構造函數
// delete的底層也分為兩部分:調用operator delete + 調用析構函數;
//
//總結:在C++中,申請和釋放堆上的空間,就用new 和 delete

3.2 實現專屬operator new 與 operator delete (了解)

//注意:一般情況下不需要對 operator new 和 operator delete 進行重載,除非在申請和釋放空間的時候具有某些特殊的要求。比如:在使用new和delete
// 申請和釋放空間時,打印一些日志信息,來簡單幫助用戶檢測是否存在內存泄漏。
//
//當我們不寫自己專屬的operator new函數和 operator delete函數的時候,new和delete 會自動調用C++庫里面的operator new函數和 operator delete函數。
//當我們自己寫專屬的operator new函數和 operator delete函數時,new和delete 會調用專屬的operator new函數和 operator delete函數來實現某些特殊的需求。// new -> operator new + 構造函數
// 默認情況下,operator new使用全局庫里面的。
// 但每個類可以去實現自己專屬operator new;  new這個類對象,它就會調用自己實現的這個operator new//實現類專屬的operator new(優先調用)
struct ListNode
{int _val;ListNode* _next;//內存池static allocator<ListNode> alloc;void* operator new(size_t n){cout<< "operator new -> STL內存池allocator申請" << endl;void* obj = alloc.allocate(1);return obj;}void operator delete(void* ptr){cout<< "operator delete -> STL內存池allocator申請" << endl;alloc.deallocate((ListNode*)ptr,1);}//構造函數struct ListNode(int val):_val(val),_next(nullptr){}
};內存池的定義
allocator<ListNode> ListNode::alloc;int main()
{//頻繁地申請 ListNode;想提高效率 —— 申請ListNode時,不去malloc,而是自己定制內存池。ListNode* node1 = new ListNode(1); //new先去調用 類里面的operator new ,如果類里面沒有operator new,就會去庫里面調用。ListNode* node2 = new ListNode(2);ListNode* node3 = new ListNode(3);delete node1;delete node2;delete node3;return 0;
}

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

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

相關文章

linux-shell腳本收集

創建同步腳本xsync mkdir -p /home/hadoop/bin && cd /home/hadoop/bin vim xsync#!/bin/bash#1. 判斷參數個數 if [ $# -lt 1 ] thenecho Not Arguementexit; fi#2. 遍歷集群所有機器 for host in node1 node2 node3 doecho $host #3. 遍歷所有目錄&#xff0c;挨…

web3:使用Docker-compose方式部署blockscout

最近做的項目,需要blockscout來部署一個區塊鏈瀏覽器,至于blockscout是什么,咱們稍后出一篇文章專門介紹下,本次就先介紹一下如何使用Docker-compose方式部署blockscout,以及過程中遇到的種種坑 目錄 先決條件我的環境準備工作Docker-compose1.安裝方式一:下載 Docker Co…

財務數據分析之現金流量表模板分享

現金流量表是我們常說的財務數據分析三表之一。它可以呈現一個企業的現金流情況&#xff0c;揭示企業經營管理健康狀態&#xff0c;但在實際使用中卻有總給人一種用不上、用不好的矛盾感。怎么才能把現金流量表做好&#xff1f;不如借鑒下大神的現金流量表模板。 下面介紹的是…

RabbitMQ-消息中間件學習記錄(what-how-why)

什么是消息中間件 簡單的來說就是消息隊列中間件&#xff0c;生產者發送消息到中間件&#xff0c;消息中間件用于 保存消息并發送消息到消費者。 消息中間件RabbitMQ的基本組件 1&#xff09;producer -生產者 2&#xff09;customer -消費者 3&#xff09;broker (經紀人)- M…

【Java 動態數據統計圖】動態數據統計思路案例(動態,排序,數組)四(116)

需求&#xff1a;&#xff1a;前端根據后端的返回數據&#xff1a;畫統計圖&#xff1b; 1.動態獲取地域數據以及數據中的平均值&#xff0c;按照平均值降序排序&#xff1b; 說明&#xff1a; X軸是動態的&#xff0c;有對應區域數據則展示&#xff1b; X軸 區域數據降序排序…

LabVIEW調用DLL傳遞結構體參數

LabVIEW 中調用動態庫接口時&#xff0c;如果是值傳遞的結構體&#xff0c;可以根據字段拆解為多個參數&#xff1b;如果參數為結構體指針&#xff0c;可用簇&#xff08;Cluster&#xff09;來匹配&#xff0c;其內存連續相當于單字節對齊。 1.值傳遞 接口定義&#xff1a; …

【FAQ】調用視頻匯聚平臺EasyCVR的iframe地址,視頻無法播放的原因排查

有用戶反饋&#xff0c;在調用iframe地址后嵌入用戶自己的前端頁面&#xff0c;視頻無法播放并且要求登錄。 安防監控視頻匯聚平臺EasyCVR基于云邊端一體化架構&#xff0c;具有強大的數據接入、處理及分發能力&#xff0c;可提供視頻監控直播、云端錄像、視頻云存儲、視頻集中…

視頻集中存儲EasyCVR視頻匯聚平臺定制項目增加AI智能算法

安防視頻集中存儲EasyCVR視頻匯聚平臺&#xff0c;可支持海量視頻的輕量化接入與匯聚管理。平臺能提供視頻存儲磁盤陣列、視頻監控直播、視頻輪播、視頻錄像、云存儲、回放與檢索、智能告警、服務器集群、語音對講、云臺控制、電子地圖、平臺級聯、H.265自動轉碼等功能。為了便…

【Unity每日一記】Physics.Raycast 相關_Unity中的“X光射線”

&#x1f468;?&#x1f4bb;個人主頁&#xff1a;元宇宙-秩沅 &#x1f468;?&#x1f4bb; hallo 歡迎 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;?&#x1f4bb; 本文由 秩沅 原創 &#x1f468;?&#x1f4bb; 收錄于專欄&#xff1a;uni…

05_bitmaphyperloglogGEO

Bitmap&hyperloglog&GEO 面試問 記錄對集合中的數據進行統計在移動應用中&#xff0c;需要統計每天的新增用戶數和第2天的留存用戶數&#xff1b;在電商網站的商品評論中&#xff0c;需要統計評論列表中的最新評論&#xff1a;在簽到打卡中&#xff0c;需要統計一個月內…

Python “貪吃蛇”游戲,在不斷改進中學習pygame編程

目錄 前言 改進過程一 增加提示信息 原版幫助摘要 pygame.draw pygame.font class Rect class Surface 改進過程二 增加顯示得分 改進過程三 增加背景景樂 增加提示音效 音樂切換 靜音切換 mixer.music.play 注意事項 原版幫助摘要 pygame.mixer pygame.mix…

kvm和vmware有什么區別?如何選擇?

一、kvm和vmware的區別 VMware vSphere 平臺 VMware 可以提供 ESXi 虛擬機監控程序和 vSphere 虛擬化平臺。VMware ESXi 是一個能夠直接安裝到物理服務器上的裸機虛擬機監控程序&#xff0c;可以幫你整合硬件。你可以用 VMware 的虛擬化技術來創建和部署虛擬機&#xff08;VM…

HTML詳解連載(7)

HTML詳解連載&#xff08;7&#xff09; 專欄鏈接 [link](http://t.csdn.cn/xF0H3)下面進行專欄介紹 開始嘍結構偽類選擇器作用 :nth-child&#xff08;公式&#xff09;作用舉例 偽元素選擇器作用注意&#xff1a; PxCoook作用盒子模型-重要組成部分 盒子模型-邊框線屬性名屬性…

excel中定位條件,excel中有哪些數據類型、excel常見錯誤值、查找與替換

一、如何定位條件 操作步驟&#xff1a;開始 - 查找和選擇 - 定位條件&#xff08;ctrl G 或 F5&#xff09; 注&#xff1a;如果F5不可用&#xff0c;可能是這個快捷鍵被占用了 案例&#xff1a;使用定位條件選擇取余中空單元格&#xff0c;填入100&#xff0c;按組合鍵ct…

【LeetCode75】第三十三題 二叉樹的最大深度

目錄 題目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代碼&#xff1a; 題目&#xff1a; 示例&#xff1a; 分析&#xff1a; 從這一題開始&#xff0c;LeetCode75進入到了二叉樹章節。 這邊建議不熟悉二叉樹的小伙伴可以先去做做力扣的前序遍歷&#xff0c;中序遍…

使用git rebase 之后的如何恢復到原始狀態

我們常常喜歡使用git rebase去切換分支提交代碼,操作流程就是: 先切換分支:比如當前是master 我們修改了一堆代碼產生一個commit id :5555555567777 那么我們常常比較懶就直接切換了:git checkout dev 然后呢?使用命令git rebase 5555555567777,想把這筆修改提交到d…

iPhone上的個人熱點丟失了怎么辦?如何修復iPhone上不見的個人熱點?

個人熱點功能可將我們的iPhone手機轉變為 Wi-Fi 熱點&#xff0c;有了Wi-Fi 熱點后就可以與附近的其他設備共享其互聯網連接。 一般情況下&#xff0c;個人熱點打開就可以使用&#xff0c;但也有部分用戶在升級系統或越獄后發現 iPhone 的個人熱點消失了。 iPhone上的個人熱點…

antd5源碼調試環境搭建(window系統)

將antd源碼克隆至本地 $ git clone gitgithub.com:ant-design/ant-design.git $ cd ant-design $ npm install $ npm start前提安裝python3、安裝node版本18版本 不然后續安裝依賴會報python3相關的錯誤。 項目需要使用git 初始化 不然會報husky相關的錯誤 git init重新安…

【論文解讀】Hybrid-SORT: Weak Cues Matter for Online Multi-Object Tracking

因為Hybrid-SORT的baseline是基于OCSORT進行改進的&#xff0c;在這之前建議先了解byteTrack和【】的相關知識 1.介紹 1.1 基本框架 多目標跟蹤(MOT)將問題分為兩個子任務。第一個任務是檢測每個幀中的對象。第二個任務是將它們在不同的框架中聯系起來。關聯任務主要通過顯式…

RabbitMq-發布確認高級(避坑指南版)

在初學rabbitMq的時候&#xff0c;伙伴們肯定已經接觸到了“發布確認”的概念&#xff0c;但是到了后期學習中&#xff0c;會接觸到“springboot”中使用“發布確認”高級的概念。后者主要是解決什么問題呢&#xff1f;或者是什么樣的場景引出這樣的概念呢&#xff1f; 在生產環…