溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C/C++的內(nèi)存管理怎么理解

發(fā)布時(shí)間:2022-01-24 11:04:19 來源:億速云 閱讀:144 作者:kk 欄目:開發(fā)技術(shù)

這篇文章的內(nèi)容主要圍繞C/C++的內(nèi)存管理怎么理解進(jìn)行講述,文章內(nèi)容清晰易懂,條理清晰,非常適合新手學(xué)習(xí),值得大家去閱讀。感興趣的朋友可以跟隨小編一起閱讀吧。希望大家通過這篇文章有所收獲!

    C/C++內(nèi)存分布

    C/C++的內(nèi)存管理怎么理解

    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";
    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 (ptr3);
    }

    習(xí)題

    1. 選擇題:
      選項(xiàng): A.棧 B.堆 C.數(shù)據(jù)段(靜態(tài)區(qū)) D.代碼段(常量區(qū))
      globalVar在哪里?__C__  staticGlobalVar在哪里?__C__
      staticVar在哪里?__C__  localVar在哪里?__A__
      num1 在哪里?__A__
      
      char2在哪里?__A__   *char2在哪里?_A__
      pChar3在哪里?_A___   *pChar3在哪里?__D__
      ptr1在哪里?__A__    *ptr1在哪里?__B__
    
    2. 填空題:(32位程序)
      sizeof(num1) = __40__;  
      sizeof(char2) = __5__;   strlen(char2) = __4__;
      sizeof(pChar3) = __4__;   strlen(pChar3) = __4__;
      sizeof(ptr1) = __4__;

    C/C++的內(nèi)存管理怎么理解

    1.堆又叫堆棧,非靜態(tài)局部變量、函數(shù)參數(shù)、返回值等等,棧是向下增長的。

    2.內(nèi)存映射段是高效的I/O映射方式,用于裝載一個(gè)共享的動(dòng)態(tài)內(nèi)存庫。用戶可使用系統(tǒng)接口創(chuàng)建共享內(nèi)存,做進(jìn)程間通信。

    3.堆用于程序運(yùn)行時(shí)動(dòng)態(tài)內(nèi)存分配,堆是可以向上增長的。

    4.數(shù)據(jù)段 – 存儲(chǔ)全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù)。

    5.代碼段 – 可執(zhí)行的代碼/只讀常量 

    C語言中動(dòng)態(tài)內(nèi)存管理方式

    malloc, calloc, realloc 的區(qū)別?

    C/C++的內(nèi)存管理怎么理解

    C/C++的內(nèi)存管理怎么理解

    C/C++的內(nèi)存管理怎么理解

    calloc 會(huì)初始化, 相當(dāng)于 malloc + memset, 按字節(jié)初始化,空間每個(gè)字節(jié)都初始化為0。
    realloc擴(kuò)容,分為原地?cái)U(kuò),異地?cái)U(kuò)。

    C++ 內(nèi)存管理方式

    申請和釋放單個(gè)元素的空間,使用new和delete操作符,申請和釋放連續(xù)的空間,使用new[]和delete[]。

    int* p1 = new int(5);

    動(dòng)態(tài)申請一個(gè)int空間,這塊空間初始化為5.

    int* p2 = new int[5];

    動(dòng)態(tài)申請5個(gè)int空間。

    int* p3 = new int[5]{1,2,3,4,5};

    給上初始值

    new和delete操作自定義類型

    在申請自定義類型的空間時(shí),new 會(huì)調(diào)用構(gòu)造函數(shù), delete 會(huì)調(diào)用析構(gòu)函數(shù),而 malloc 與 free 不會(huì)。

    operator new 與 operator delete函數(shù)

    new 和 delete 是用戶進(jìn)行 動(dòng)態(tài)內(nèi)存申請 和釋放的操作符, operator new 和 operator delete 是系統(tǒng)提供的全局函數(shù)。
    new 在底層調(diào)用operator new全局函數(shù)來申請空間,delete 在底層通過operator delete全局函數(shù)來釋放空間。

    • operator new :該函數(shù)通過 malloc 來申請空間,當(dāng) malloc 申請空間成功時(shí)直接返回;申請空間失敗,嘗試執(zhí)行空間不足應(yīng)對(duì)措施,如果改應(yīng)對(duì)措施用戶設(shè)置了,則就行申請,否則 跑異常。

    • operator delete:該函數(shù)最終是通過free來釋放空間的。 

    new和delete的實(shí)現(xiàn)原理

    1.內(nèi)置類型

    如果申請的是內(nèi)置類型的空間, new 和 malloc, deletefree基本類似,不同的地方是:new/delete申請和釋放的是單個(gè)元素的空間。

    new[] 和 delete[] 申請的是連續(xù)空間,而且new在申請空間失敗時(shí)會(huì)拋異常, malloc 會(huì)返回 NULL。

    2.自定義類型

    • new原理

    1.調(diào)用 operator new 函數(shù)申請空間

    2.在申請的空間上執(zhí)行構(gòu)造函數(shù),完成對(duì)象的構(gòu)造。 

    • delete的原理

    1.在空間上執(zhí)行析構(gòu)函數(shù),完成對(duì)象中資源的清理工作。

    2.調(diào)用 operator delete 函數(shù)釋放對(duì)象的空間。

    •  new T[N]的原理

    1.調(diào)用operator new[]函數(shù),在operator new[]中實(shí)際調(diào)用operator new函數(shù)完成N個(gè)對(duì)象空間的申請

    2.在申請的空間上執(zhí)行N次構(gòu)造函數(shù) 

    • delete[]的原理

    1.在釋放的對(duì)象空間上執(zhí)行N次析構(gòu)函數(shù),完成N個(gè)對(duì)象中資源的清理

    2.調(diào)用operator delete[]釋放空間,實(shí)際在operator delete[]中調(diào)用operator delete來釋放空間 

    malloc/free和new/delete的區(qū)別

    malloc/free和new/delete的共同點(diǎn)是:都是從堆上申請空間,并且需要用戶手動(dòng)釋放。

    不同的地方是:

    1.malloc和free是函數(shù),new和delete是操作符

    2.malloc申請的空間不會(huì)初始化,new可以初始化

    3.malloc申請空間時(shí),需要手動(dòng)計(jì)算空間大小并傳遞,new只需在其后跟上空間的類型即可

    4.malloc的返回值為void*, 在使用時(shí)必須強(qiáng)轉(zhuǎn),new不需要,因?yàn)閚ew后跟的是空間的類型

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

    6.申請自定義類型對(duì)象時(shí),malloc/free只會(huì)開辟空間,不會(huì)調(diào)用構(gòu)造函數(shù)與析構(gòu)函數(shù),而new在申請空間后會(huì)調(diào)用構(gòu)造函數(shù)完成對(duì)象的初始化,delete在釋放空間前會(huì)調(diào)用析構(gòu)函數(shù)完成空間中資源的清理

    C語言是什么

    C語言是一門面向過程的、抽象化的通用程序設(shè)計(jì)語言,廣泛應(yīng)用于底層開發(fā),使用C語言可以以簡易的方式編譯、處理低級(jí)存儲(chǔ)器。

    感謝你的閱讀,相信你對(duì)“C/C++的內(nèi)存管理怎么理解”這一問題有一定的了解,快去動(dòng)手實(shí)踐吧,如果想了解更多相關(guān)知識(shí)點(diǎn),可以關(guān)注億速云網(wǎng)站!小編會(huì)繼續(xù)為大家?guī)砀玫奈恼拢?/p>

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI