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

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

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

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

前言

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

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

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

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

1.1 棧(Stack)

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

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

1.2 堆(Heap)

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

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

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

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

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

int globalVar = 1;
static int staticVar = 1;

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

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

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

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

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

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

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

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

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

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

3.1 malloc

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

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

特點(diǎn):只申請空間;不初始化,因此里面是隨機(jī)值。

3.2 calloc

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

特點(diǎn):申請多個(gè)元素空間;自動(dòng)初始化為 0。相當(dāng)于:malloc + memset(0)。

3.3 realloc

用于擴(kuò)容:

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

分別是原地?cái)U(kuò)容和異地?cái)U(kuò)容。

3.4 free

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

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

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

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

  • 需要手動(dòng)計(jì)算大??;
  • 返回值需要強(qiáng)轉(zhuǎn);
  • 無法自動(dòng)初始化對象;
  • 無法調(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 會(huì)調(diào)用構(gòu)造析構(gòu);A* p = new A(10);;A* p = new A(10);這里會(huì)申請空間和調(diào)用構(gòu)造函數(shù)。
delete時(shí)會(huì)調(diào)用析構(gòu)函數(shù)和釋放空間。

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

new[]:A* arr = new A[3];底層會(huì):申請3個(gè)對象空間并且調(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)文章

最新評論

黄平县| 香港 | 颍上县| 凌云县| 肥西县| 常熟市| 泸溪县| 洞口县| 龙海市| 阿勒泰市| 马边| 平谷区| 萍乡市| 万年县| 平罗县| 黄平县| 宜州市| 鄂伦春自治旗| 胶州市| 瓦房店市| 化州市| 黄大仙区| 白沙| 铁岭县| 庆阳市| 晋宁县| 灵石县| 长顺县| 定襄县| 定安县| 莱阳市| 林芝县| 阿图什市| 曲水县| 武定县| 阿拉善左旗| 内黄县| 双牌县| 南澳县| 兴化市| 东阳市|