最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++ 內(nèi)存管理詳解:從內(nèi)存分布到 new/delete 原理解析

 更新時間:2026年05月22日 10:35:06   作者:是dooo啊  
本文給大家介紹C/C++ 內(nèi)存管理詳解:從內(nèi)存分布到 new/delete 原理解析,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

在 C++ 中,內(nèi)存管理是一個核心概念,涉及到如何有效地使用內(nèi)存資源。C++ 內(nèi)存管理主要包括內(nèi)存分配和內(nèi)存釋放兩個方面,主要通過 new 和 delete 操作符來實現(xiàn)。下面我們將詳細探討 C++ 中的內(nèi)存管理,包括內(nèi)存的分布、new 和 delete 的工作原理以及一些高級話題,如智能指針的使用。

前言

在學習 C/C++ 的過程中,內(nèi)存管理是繞不開的核心知識。很多初學者會感覺:

  • 棧、堆、靜態(tài)區(qū)到底有什么區(qū)別?
  • malloc 和 new 到底差在哪?
  • 為什么 delete[] 不能寫成 delete?
  • new 底層到底做了什么?
    如果這些問題沒有形成完整體系,后面學習 STL、智能指針、內(nèi)存池、操作系統(tǒng)時會越來越混亂。這篇文章將系統(tǒng)梳理整個知識鏈路,幫助你真正建立對內(nèi)存管理的整體認知。

一、程序運行時的內(nèi)存分布

一個 C/C++ 程序運行后,內(nèi)存并不是隨便使用的,而是被劃分為不同區(qū)域。
通常我們會接觸到以下幾個區(qū)域:

1.1 棧(Stack)

棧主要存儲:局部變量;函數(shù)參數(shù);返回值
特點:由系統(tǒng)自動管理;生命周期隨函數(shù)結(jié)束而結(jié)束,向下增長,速度快

void Test()
{
    int a = 10;
}
//這里的 a 就在棧上。

1.2 堆(Heap)

堆用于動態(tài)內(nèi)存申請:

int* p = (int*)malloc(sizeof(int));

特點:由程序員手動管理;需要 free/delete;生命周期由程序員決定;向上增長;靈活但容易泄漏

1.3 數(shù)據(jù)段(靜態(tài)區(qū))

用于存儲:全局變量;static 靜態(tài)變量

int globalVar = 1;
static int staticVar = 1;

1.4 代碼段(常量區(qū))

存儲:可執(zhí)行代碼;字符串常量;const 常量

const char* str = "hello";
//字符串 "hello" 位于常量區(qū)。

二、理解變量“本身”和“指向內(nèi)容

這是初學者最容易混淆的地方。來看經(jīng)典例子:

char arr[] = "abcd";
const char* p = "abcd";

很多人以為它們一樣,其實完全不同。

char arr[] = "abcd";
const char* p = "abcd";
  • arr 是數(shù)組,數(shù)組本身在棧上,“abcd” 被拷貝到數(shù)組中。所以arr 在棧;arr中的字符也在棧。
  • p 是指針變量,指針本身在棧上,“abcd” 字符串常量在常量區(qū)。所以p 在棧;p指向的內(nèi)容在常量區(qū)

三、C 語言動態(tài)內(nèi)存管理

C 中主要使用四個函數(shù):malloc;calloc;realloc;free。

3.1 malloc

申請指定大小內(nèi)存:

int* p = (int*)malloc(sizeof(int));

特點:只申請空間;不初始化,因此里面是隨機值。

3.2 calloc

int* p = (int*)calloc(4, sizeof(int));

特點:申請多個元素空間;自動初始化為 0。相當于:malloc + memset(0)。

3.3 realloc

用于擴容:

p = (int*)realloc(p, sizeof(int) * 10);

分別是原地擴容和異地擴容。

3.4 free

釋放動態(tài)內(nèi)存:

free(p);
//free 后不要繼續(xù)使用指針
p = NULL;

四、C++ 為什么引入 new/delete

雖然 C 的 malloc/free 能用,但存在很多問題:

  • 需要手動計算大??;
  • 返回值需要強轉(zhuǎn);
  • 無法自動初始化對象;
  • 無法調(diào)用構(gòu)造函數(shù)/析構(gòu)函數(shù);
    于是 C++ 引入:new和delete。

4.1new/delete 基本使用

//單對象
int* p = new int(10);
delete p;
//對象數(shù)組
int* arr = new int[10];
delete[] arr;

注意:new[] 必須對應(yīng) delete[]

4.2new/delete 與 malloc/free 最大區(qū)別

核心區(qū)別:malloc/free 只管理內(nèi)存;new/delete 既管理內(nèi)存,也管理對象。

1.malloc/free 不調(diào)用構(gòu)造析構(gòu);A* p = (A*)malloc(sizeof(A));;這里只是開空間。對象并沒有真正構(gòu)造。

2.new/delete 會調(diào)用構(gòu)造析構(gòu);A* p = new A(10);;A* p = new A(10);這里會申請空間和調(diào)用構(gòu)造函數(shù)。
delete時會調(diào)用析構(gòu)函數(shù)和釋放空間。

4.3new[] 和 delete[] 為什么必須匹配

new[]:A* arr = new A[3];底層會:申請3個對象空間并且調(diào)用3次構(gòu)造函數(shù)
delete[]:delete[] arr;調(diào)用3次析構(gòu)函數(shù)并且釋放空間

到此這篇關(guān)于C/C++ 內(nèi)存管理詳解:從內(nèi)存分布到 new/delete 原理解析的文章就介紹到這了,更多相關(guān)C++內(nèi)存管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實現(xiàn)趣味掃雷游戲

    C++實現(xiàn)趣味掃雷游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)趣味掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++中I/O模型之select模型實例

    C++中I/O模型之select模型實例

    這篇文章主要介紹了C++中I/O模型的select模型,實例講述了I/O模型的用法,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • Visual?Studio?Code?配置C、C++?文件debug調(diào)試環(huán)境的詳細過程

    Visual?Studio?Code?配置C、C++?文件debug調(diào)試環(huán)境的詳細過程

    這篇文章主要介紹了Visual?Studio?Code?配置C、C++?文件debug調(diào)試環(huán)境,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • C++獲取指定目錄下的所有文件

    C++獲取指定目錄下的所有文件

    這篇文章主要為大家詳細介紹了C++獲取指定目錄下所有文件的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C語言中有哪些字符處理函數(shù)你知道嗎

    C語言中有哪些字符處理函數(shù)你知道嗎

    這篇文章主要為大家詳細介紹了C語言字符處理函數(shù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表的實現(xiàn)

    C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表的實現(xiàn)

    鏈表是一種物理存儲結(jié)構(gòu)上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。本文將用C語言實現(xiàn)單鏈表,需要的可以參考一下
    2022-06-06
  • C語言讀取BMP圖像數(shù)據(jù)的源碼

    C語言讀取BMP圖像數(shù)據(jù)的源碼

    這篇文章主要介紹了C語言讀取BMP圖像數(shù)據(jù)的源碼,需要的朋友可以參考下
    2013-03-03
  • C語言學生成績管理系統(tǒng)課程設(shè)計

    C語言學生成績管理系統(tǒng)課程設(shè)計

    這篇文章主要為大家詳細介紹了C語言學生成績管理系統(tǒng)課程設(shè)計,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語言宏定義的擴展定義講解

    C語言宏定義的擴展定義講解

    這篇文章主要介紹了C語言宏定義的擴展,宏定義是C語言提供的三種預(yù)處理功能的其中一種,這三種預(yù)處理包括:宏定義、文件包含、條件編譯
    2022-12-12
  • Qt實現(xiàn)簡易毛玻璃效果的示例代碼

    Qt實現(xiàn)簡易毛玻璃效果的示例代碼

    這篇文章主要介紹了Qt如何利用模糊功能實現(xiàn)簡易的毛玻璃效果,并且鼠標可以移動無邊框窗口,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-06-06

最新評論

朝阳市| 瓦房店市| 筠连县| 湾仔区| 花垣县| 抚远县| 桐乡市| 六盘水市| 乐安县| 青河县| 瑞丽市| 科尔| 西林县| 仪征市| 拉孜县| 高青县| 保山市| 萝北县| 合肥市| 泗洪县| 库伦旗| 平乐县| 乌拉特后旗| 辽源市| 瑞安市| 嘉峪关市| 肇源县| 郯城县| 长宁县| 祁门县| 应城市| 漯河市| 西昌市| 甘南县| 香格里拉县| 阿拉善盟| 迭部县| 南康市| 康平县| 钟祥市| 阿克陶县|