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__;

1.堆又叫堆棧,非靜態(tài)局部變量、函數(shù)參數(shù)、返回值等等,棧是向下增長(zhǎng)的。
2.內(nèi)存映射段是高效的I/O映射方式,用于裝載一個(gè)共享的動(dòng)態(tài)內(nèi)存庫(kù)。用戶可使用系統(tǒng)接口創(chuàng)建共享內(nèi)存,做進(jìn)程間通信。
3.堆用于程序運(yùn)行時(shí)動(dòng)態(tài)內(nèi)存分配,堆是可以向上增長(zhǎng)的。
4.數(shù)據(jù)段 – 存儲(chǔ)全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù)。
5.代碼段 – 可執(zhí)行的代碼/只讀常量
C語(yǔ)言中動(dòng)態(tài)內(nèi)存管理方式
malloc, calloc, realloc 的區(qū)別?



calloc 會(huì)初始化, 相當(dāng)于 malloc + memset, 按字節(jié)初始化,空間每個(gè)字節(jié)都初始化為0。realloc擴(kuò)容,分為原地?cái)U(kuò),異地?cái)U(kuò)。
C++ 內(nèi)存管理方式
申請(qǐng)和釋放單個(gè)元素的空間,使用new和delete操作符,申請(qǐng)和釋放連續(xù)的空間,使用new[]和delete[]。
int* p1 = new int(5);
動(dòng)態(tài)申請(qǐng)一個(gè)int空間,這塊空間初始化為5.
int* p2 = new int[5];
動(dòng)態(tài)申請(qǐng)5個(gè)int空間。
int* p3 = new int[5]{1,2,3,4,5};給上初始值
new和delete操作自定義類(lèi)型
在申請(qǐng)自定義類(lèi)型的空間時(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)存申請(qǐng) 和釋放的操作符, operator new 和 operator delete 是系統(tǒng)提供的全局函數(shù)。
new 在底層調(diào)用operator new全局函數(shù)來(lái)申請(qǐng)空間,delete 在底層通過(guò)operator delete全局函數(shù)來(lái)釋放空間。
operator new:該函數(shù)通過(guò)malloc來(lái)申請(qǐng)空間,當(dāng)malloc申請(qǐng)空間成功時(shí)直接返回;申請(qǐng)空間失敗,嘗試執(zhí)行空間不足應(yīng)對(duì)措施,如果改應(yīng)對(duì)措施用戶設(shè)置了,則就行申請(qǐng),否則 跑異常。operator delete:該函數(shù)最終是通過(guò)free來(lái)釋放空間的。
new和delete的實(shí)現(xiàn)原理
1.內(nèi)置類(lèi)型
如果申請(qǐng)的是內(nèi)置類(lèi)型的空間, new 和 malloc, delete和free基本類(lèi)似,不同的地方是:new/delete申請(qǐng)和釋放的是單個(gè)元素的空間。
new[] 和 delete[] 申請(qǐng)的是連續(xù)空間,而且new在申請(qǐng)空間失敗時(shí)會(huì)拋異常, malloc 會(huì)返回 NULL。
2.自定義類(lèi)型
- new原理
1.調(diào)用 operator new 函數(shù)申請(qǐng)空間
2.在申請(qǐng)的空間上執(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ì)象空間的申請(qǐng)
2.在申請(qǐng)的空間上執(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來(lái)釋放空間
malloc/free和new/delete的區(qū)別
malloc/free和new/delete的共同點(diǎn)是:都是從堆上申請(qǐng)空間,并且需要用戶手動(dòng)釋放。
不同的地方是:
1.malloc和free是函數(shù),new和delete是操作符
2.malloc申請(qǐng)的空間不會(huì)初始化,new可以初始化
3.malloc申請(qǐng)空間時(shí),需要手動(dòng)計(jì)算空間大小并傳遞,new只需在其后跟上空間的類(lèi)型即可
4.malloc的返回值為void*, 在使用時(shí)必須強(qiáng)轉(zhuǎn),new不需要,因?yàn)閚ew后跟的是空間的類(lèi)型
5.malloc申請(qǐng)空間失敗時(shí),返回的是NULL,因此使用時(shí)必須判空,new不需要,但是new需要捕獲異常
6.申請(qǐng)自定義類(lèi)型對(duì)象時(shí),malloc/free只會(huì)開(kāi)辟空間,不會(huì)調(diào)用構(gòu)造函數(shù)與析構(gòu)函數(shù),而new在申請(qǐng)空間后會(huì)調(diào)用構(gòu)造函數(shù)完成對(duì)象的初始化,delete在釋放空間前會(huì)調(diào)用析構(gòu)函數(shù)完成空間中資源的清理
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
在C++?Qt中實(shí)現(xiàn)異步散列器的代碼示例
在很多工作中,我們需要計(jì)算數(shù)據(jù)或者文件的散列值,例如登錄或下載文件,而在?Qt?中,負(fù)責(zé)這項(xiàng)工作的類(lèi)為?QCryptographicHash,本文給大家介紹了在C++?Qt中實(shí)現(xiàn)異步散列器的代碼示例,需要的朋友可以參考下2024-09-09
C++?Socket實(shí)現(xiàn)TCP與UDP網(wǎng)絡(luò)編程
本文主要介紹了C++?Socket實(shí)現(xiàn)TCP與UDP網(wǎng)絡(luò)編程,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
C++中string類(lèi)的常用方法實(shí)例總結(jié)
string類(lèi)是C++提供的抽象數(shù)據(jù)類(lèi)型,其支持可變長(zhǎng)字符串,下面這篇文章主要給大家總結(jié)介紹了關(guān)于C++中string類(lèi)的常用方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
C++關(guān)鍵字mutable學(xué)習(xí)筆記
這篇文章主要為大家介紹了C++關(guān)鍵字mutable學(xué)習(xí)筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
Qt利用tablewidget模擬手指實(shí)現(xiàn)滑動(dòng)
這篇文章主要為大家詳細(xì)介紹了Qt如何利用tablewidget模擬手指實(shí)現(xiàn)滑動(dòng)效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定的幫助,需要的可以參考一下2023-01-01
使用Qt實(shí)現(xiàn)監(jiān)聽(tīng)網(wǎng)頁(yè)是否響應(yīng)并導(dǎo)出Excel表
Qt導(dǎo)出數(shù)據(jù)到excel,方法有很多,下面這篇文章主要給大家介紹了關(guān)于使用Qt實(shí)現(xiàn)監(jiān)聽(tīng)網(wǎng)頁(yè)是否響應(yīng)并導(dǎo)出Excel表的相關(guān)資料,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11

