版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C++動(dòng)態(tài)內(nèi)存管理詳解目錄1.C/C++程序地址空間2.C語言動(dòng)態(tài)內(nèi)存管理(1)malloc(2)calloc(3)realloc(4)free3.C++動(dòng)態(tài)內(nèi)存管理(1)C++為什么要設(shè)計(jì)一套自己專屬的動(dòng)態(tài)內(nèi)存管理方式(2)new/delete定義1)new/delete操作內(nèi)置類型2)new/delete操作自定義類型(3)new/delete的實(shí)現(xiàn)原理4.malloc/free和new/delete的區(qū)別共同點(diǎn):
不同點(diǎn):
5.內(nèi)存泄漏總結(jié)
1.C/C++程序地址空間
計(jì)算機(jī)物理內(nèi)存的大小是固定的,在32位系統(tǒng)上,地址空間可達(dá)4G(2^32),這4G按照3:1的比例分配給用戶進(jìn)程和內(nèi)核。程序地址空間的構(gòu)成:從上往下依次是:內(nèi)核空間、棧區(qū)、共享區(qū)、堆區(qū)、未初始化數(shù)據(jù)區(qū)、初始化數(shù)據(jù)區(qū)、代碼區(qū)。而動(dòng)態(tài)內(nèi)存管理所申請(qǐng)的空間都是在堆區(qū),在堆區(qū)動(dòng)態(tài)開辟的空間都需要我們手動(dòng)去釋放它,否則會(huì)造成內(nèi)存泄漏。
內(nèi)核空間:操作系統(tǒng)相關(guān)代碼
棧區(qū):從高地址向低地址增長(zhǎng)
共享區(qū):加載動(dòng)態(tài)庫,共享內(nèi)存
堆區(qū):從低地址向高地址增長(zhǎng)
未初始化全局?jǐn)?shù)據(jù)區(qū)
已初始化全局?jǐn)?shù)據(jù)區(qū)
代碼區(qū):可執(zhí)行代碼及只讀常量
2.C語言動(dòng)態(tài)內(nèi)存管理
(1)malloc
void*malloc(size_tsize);
malloc()函數(shù)只有一個(gè)參數(shù),即要分配的內(nèi)存空間的大小。
如果開辟成功,則返回一個(gè)指向開辟好空間的指針,如果開辟失敗,則返回一個(gè)空指針,因此每次申請(qǐng)完空間都需要判空。
malloc()函數(shù)返回值的類型是void*,在使用時(shí)需要自己強(qiáng)制轉(zhuǎn)換。
(2)calloc
void*calloc(size_tnum,size_tsize);
calloc()函數(shù)有兩個(gè)參數(shù),分別是元素的數(shù)目和每個(gè)元素的大小,這兩個(gè)參數(shù)的乘積就是要分配的內(nèi)存空間的大小。
malloc申請(qǐng)后空間的值是隨機(jī)的,并沒有進(jìn)行初始化,而calloc在申請(qǐng)后,對(duì)空間逐一進(jìn)行初始化,并設(shè)置值為0;
calloc由于給每一個(gè)空間都要初始化,所以效率必然比malloc低。
(3)realloc
void*realloc(void*ptr,size_tsize);
realloc()函數(shù)就實(shí)現(xiàn)對(duì)動(dòng)態(tài)開辟內(nèi)存大小的調(diào)整。
realloc()函數(shù)包含兩個(gè)參數(shù),分別是要調(diào)整的內(nèi)存地址和調(diào)整的新大小。
realloc在調(diào)整內(nèi)存空間時(shí)有兩種情況:
情況1:原有空間之后有足夠大的空間,我們就把需要擴(kuò)展的內(nèi)存直接放到原來空間的后面,原來空間的數(shù)據(jù)不發(fā)生變化。
情況2:原有空間之后沒有足夠大的空間,那就在堆上找一個(gè)合適大小的連續(xù)空間,將原來內(nèi)存中的數(shù)據(jù)移動(dòng)到新空間,然后將這個(gè)新空間的地址返回。
(4)free
void*free(void*ptr);
free函數(shù)用來釋放動(dòng)態(tài)開辟的函數(shù)。
3.C++動(dòng)態(tài)內(nèi)存管理
(1)C++為什么要設(shè)計(jì)一套自己專屬的動(dòng)態(tài)內(nèi)存管理方式
C++作為一門在C語言的基礎(chǔ)上發(fā)展而來的語言,它本身是完全兼容C語言的,也就是說,C語言的動(dòng)態(tài)內(nèi)存管理方式在C++中依舊可以正常使用。那它為什么還要設(shè)計(jì)一套屬于自己的動(dòng)態(tài)內(nèi)存管理方式呢?
在C++中,使用malloc/free申請(qǐng)或釋放內(nèi)置類型的空間并沒有任何問題,但我們知道C++引入了類和對(duì)象的概念,而這一點(diǎn)帶來的影響就是并不能使用malloc從堆上為對(duì)象申請(qǐng)空間,因?yàn)閙alloc并不會(huì)去主動(dòng)的去調(diào)用構(gòu)造函數(shù),這意味著其并不能成為真正的對(duì)象。所以如果使用malloc只是申請(qǐng)了一段和對(duì)象同樣大小的空間而言,并非對(duì)象。同理使用free并不能釋放堆上對(duì)象的空間,因?yàn)閒ree并不會(huì)調(diào)用析構(gòu)函數(shù)去釋放對(duì)象中的資源。
而且C++所提供的動(dòng)態(tài)內(nèi)存管理方式使用起來更加方便、簡(jiǎn)單,對(duì)用戶更加友好,并且不用去擔(dān)心空間可能會(huì)申請(qǐng)失敗的情況。
(2)new/delete定義
new操作符的格式:
new類型;
new類型(初值);
new類型[];
delete操作符的格式:
delete指針變量;
delete[]指針變量;
1)new/delete操作內(nèi)置類型
intmain(){
int*p1=newint;//動(dòng)態(tài)申請(qǐng)一個(gè)int類型的空間
int*p2=newint(10);//動(dòng)態(tài)申請(qǐng)一個(gè)int類型的空間并初始化為10
int*p3=newint[3];//動(dòng)態(tài)申請(qǐng)10個(gè)int類型的空間
//釋放申請(qǐng)的空間
deletep1;
deletep2;
delete[]p3;
return0;
2)new/delete操作自定義類型
//定義一個(gè)簡(jiǎn)單的類
classData{
public:
//構(gòu)造函數(shù)
Data(intdata=0):_data(data)
cout"Data():"thisendl;
//析構(gòu)函數(shù)
~Data()
cout"~Data():"thisendl;
private:
int_data;
intmain()
Data*d1=newData;//申請(qǐng)單個(gè)Data類型的對(duì)象
Data*d2=newData(10);//申請(qǐng)單個(gè)Data類型的對(duì)象并初始化
Data*d3=newData[5];//申請(qǐng)5個(gè)Data類型的對(duì)象
//依次釋放申請(qǐng)的對(duì)象資源
deleted1;
deleted2;
delete[]d3;
//使用new/delete為類對(duì)象申請(qǐng)或釋放空間時(shí)會(huì)主動(dòng)調(diào)用構(gòu)造函數(shù)/析構(gòu)函數(shù)完成對(duì)象的構(gòu)造/資源的清理。
return0;
(3)new/delete的實(shí)現(xiàn)原理
new和delete在堆上申請(qǐng)和釋放空間的時(shí)候,在底層實(shí)際上調(diào)用的是operatornew和operatordelete兩個(gè)全局函數(shù)。
而operatornew和operatordelete最終還是調(diào)用malloc和free來申請(qǐng)和釋放空間。
1)new/delete內(nèi)置類型的原理
如果申請(qǐng)的是內(nèi)置類型的空間,new和malloc,delete和free基本類似,不同的地方是:new/delete申請(qǐng)和釋放的是單個(gè)元素的空間,new[]和delete[]申請(qǐng)的是連續(xù)空間,而且new在申請(qǐng)空間失敗時(shí)會(huì)拋異常,malloc會(huì)返回NULL。也就是說使用new操作符不需要進(jìn)行判空。
2)new/delete自定義類型的原理
new的原理
1.調(diào)用operatornew函數(shù)申請(qǐng)空間
2.在申請(qǐng)的空間上執(zhí)行構(gòu)造函數(shù),完成對(duì)象的構(gòu)造
delete的原理
1.在空間上執(zhí)行析構(gòu)函數(shù),完成對(duì)象中資源的清理工作
2.調(diào)用operatordelete函數(shù)釋放對(duì)象的空間
new[]的原理
1.調(diào)用operatornew[]函數(shù),在operatornew[]中實(shí)際調(diào)用operatornew函數(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)用operatordelete[]釋放空間,在operatordelete[]中實(shí)際調(diào)用operatordelete來釋放空間
4.malloc/free和new/delete的區(qū)別
共同點(diǎn):
都是從堆上申請(qǐng)空間,并且需要用戶手動(dòng)釋放。
不同點(diǎn):
1.malloc和free是函數(shù),new和delete是C++中的操作符
2.malloc申請(qǐng)的空間不會(huì)初始化,new可以初始化
3.malloc申請(qǐng)空間時(shí),需要手動(dòng)計(jì)算空間大小并傳遞,new只需在其后跟上類型即可
4.malloc的返回值為void*,在使用時(shí)必須強(qiáng)轉(zhuǎn),new不需要,因?yàn)閚ew后跟的是空間的類型
5.malloc申請(qǐng)空間失敗時(shí),返回的是NULL,因此使用時(shí)必須判空,new不需要,但是new需要捕獲異常
6.申請(qǐng)自定義類型對(duì)象時(shí),malloc/free只會(huì)開辟空間,不會(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ù)完成空間中資源的清理
5.內(nèi)存泄漏
內(nèi)存泄漏是指你向系統(tǒng)申請(qǐng)分配內(nèi)存進(jìn)行使用
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 老年高血壓患者多重共病管理方案
- 建筑施工腳手架拆除安全管理制度
- 老年高血壓合并多器官功能衰竭血流動(dòng)力學(xué)監(jiān)測(cè)與血壓調(diào)控方案
- 機(jī)關(guān)值班值守制度執(zhí)行情況匯報(bào)
- 超聲檢查質(zhì)量管控制度及流程
- 老年重癥患者液體管理的個(gè)體化方案
- 老年門診綜合服務(wù)提升患者滿意度的策略
- 老年跌倒風(fēng)險(xiǎn)評(píng)估的精準(zhǔn)化策略
- 2026山東濟(jì)南高新區(qū)龍奧大廈附近小學(xué)招聘派遣制小學(xué)數(shù)學(xué)代課老師1人備考題庫及1套完整答案詳解
- 2026中國聯(lián)通牟定分公司招聘3人備考題庫及答案詳解(奪冠系列)
- 2026重慶高新開發(fā)建設(shè)投資集團(tuán)招聘3人備考考試試題及答案解析
- 2026北京海淀初三上學(xué)期期末語文試卷和答案
- 2025學(xué)年度人教PEP五年級(jí)英語上冊(cè)期末模擬考試試卷(含答案含聽力原文)
- 刀模管理制度
- NB-T 47013.2-2015 承壓設(shè)備無損檢測(cè) 第2部分-射線檢測(cè)
- 揮發(fā)性有機(jī)物(VOCs)執(zhí)法監(jiān)測(cè)能力建設(shè)項(xiàng)目可行性實(shí)施方案
- 工程施工月報(bào)表
- GB/T 3098.6-2023緊固件機(jī)械性能不銹鋼螺栓、螺釘和螺柱
- 公司食材配送方案
- GA/T 952-2011法庭科學(xué)機(jī)動(dòng)車發(fā)動(dòng)機(jī)號(hào)碼和車架號(hào)碼檢驗(yàn)規(guī)程
- 教科版科學(xué)五年級(jí)下冊(cè)《生物與環(huán)境》單元教材解讀及教學(xué)建議
評(píng)論
0/150
提交評(píng)論