要努力,但不要著急,繁花錦簇,碩果累累,都需要過(guò)程!
成都創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)與策劃設(shè)計(jì),鄱陽(yáng)網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:鄱陽(yáng)等地區(qū)。鄱陽(yáng)做網(wǎng)站價(jià)格咨詢:028-86922220目錄
前言:
1.C/C++內(nèi)存分布
2.C/C++動(dòng)態(tài)內(nèi)存管理方式
2.1C語(yǔ)言動(dòng)態(tài)內(nèi)存管理:
2.2C++語(yǔ)言動(dòng)態(tài)內(nèi)存管理:
2.3operator new和operator delete函數(shù):
2.4new和delete的實(shí)現(xiàn)原理:
3.常見(jiàn)的面試題
總結(jié):
1.C/C++內(nèi)存分布本篇是主要介紹關(guān)于C語(yǔ)言和C++語(yǔ)言如何進(jìn)行動(dòng)態(tài)內(nèi)存管理,動(dòng)態(tài)內(nèi)存管理不僅在語(yǔ)言學(xué)習(xí)的路上非常重要,而且也是在面試的時(shí)候面試官通常會(huì)問(wèn)到的一個(gè)熱點(diǎn)問(wèn)題。
在編譯器上我們寫(xiě)完代碼之后,代碼會(huì)保存到文件中,當(dāng)我們編譯鏈接完成之后,會(huì)生成一個(gè).exe的可執(zhí)行程序,此時(shí)我們的代碼會(huì)根據(jù)不同的類型保存到虛擬進(jìn)程地址空間,如下圖
2.C/C++動(dòng)態(tài)內(nèi)存管理方式1.C/C++中程序內(nèi)存劃分:
不同區(qū)域變量保存類型:
棧:局部變量,函數(shù)形參? ?
堆區(qū):malloc,calloc,realloc申請(qǐng)的空間
靜態(tài)區(qū):全局變量,static修飾的全局變量,static修飾的局部變量
代碼段(常量區(qū)):字符常量等??
2.內(nèi)存區(qū)域分布練習(xí):
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"; const 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); }
2.1C語(yǔ)言動(dòng)態(tài)內(nèi)存管理:在C/C++中我們經(jīng)常會(huì)向堆上申請(qǐng)空間,因?yàn)槎焉系目臻g比較大,但是堆上申請(qǐng)的空間如果使用者自己不主動(dòng)釋放的時(shí)候就會(huì)造成內(nèi)存泄漏,因此既好用又難用,成為面試官針對(duì)程序員對(duì)語(yǔ)言掌握情況而常問(wèn)的問(wèn)題
2.2C++語(yǔ)言動(dòng)態(tài)內(nèi)存管理:關(guān)于對(duì)C語(yǔ)言動(dòng)態(tài)內(nèi)存的介紹,前邊已經(jīng)介紹,詳情請(qǐng)戳—>C語(yǔ)言動(dòng)態(tài)內(nèi)存詳解
2.3operator new和operator delete函數(shù):C++通過(guò)兩個(gè)操作符向堆上申請(qǐng)空間的:
new:向堆上申請(qǐng)空間
delete:釋放申請(qǐng)的空間
int main() { //申請(qǐng)內(nèi)存 int* p = new int; //釋放內(nèi)存 delete p; return 0; }
注:內(nèi)置類型申請(qǐng)的內(nèi)存空間默認(rèn)不初始化
初始化的方式:
一次性申請(qǐng)一塊大的空間:
C++中的new和delete與C語(yǔ)言的malloc和free在用法上并沒(méi)有什么區(qū)別,對(duì)于內(nèi)置類型效果相同,但是對(duì)于自定義類型,new和delete會(huì)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)?
class A { public: A(int a = 0) : _a(a) { cout<< "A():"<< this<< endl; } ~A() { cout<< "~A():"<< this<< endl; } private: int _a; }; int main() { A* p = new A; delete p; return 0; }
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)釋放空間
2.4new和delete的實(shí)現(xiàn)原理:new和delete底層調(diào)用:可以通過(guò)反匯編進(jìn)行觀察
而operator new和operator delete函數(shù)又調(diào)用的是malloc和free
3.常見(jiàn)的面試題內(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ì)拋異常(后續(xù)解釋),malloc會(huì)返回NULL。自定義類型:
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)釋
放空間
總結(jié):1.malloc/free和new/delete的區(qū)別?
共同特點(diǎn):
malloc/free和new/delete都是從堆上申請(qǐng)空間,使用完之后需要手動(dòng)釋放
不同點(diǎn):
1.malloc和free是函數(shù),new和delete是操作符;
2.對(duì)于自定義類型malloc申請(qǐng)的空間不會(huì)初始化,new申請(qǐng)的空間會(huì)調(diào)用構(gòu)造函數(shù)進(jìn)行初始化
3.malloc申請(qǐng)空間需要傳遞空間大小,new只需在后面跟上空間大小即可,如果是多個(gè)對(duì)象,只需在[]中指明對(duì)象的個(gè)數(shù)即可;
4.malloc的返回類型是void*,在使用的時(shí)候必須強(qiáng)轉(zhuǎn),new不需要;
5.malloc空間申請(qǐng)失敗時(shí)返回NULL, new空間申請(qǐng)失敗拋異常;
6.申請(qǐng)自定義類型的對(duì)象時(shí)malloc和free不會(huì)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)對(duì)空間進(jìn)行初始化,和對(duì)象資源的清理,new和delete會(huì)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)完成對(duì)象的初始化和對(duì)象資源的清理
2.什么是內(nèi)存泄漏,內(nèi)存泄漏的危害是什么?
內(nèi)存泄漏是指因?yàn)殄e(cuò)誤或疏忽造成程序未能釋放已經(jīng)不再使用內(nèi)存的情況,內(nèi)存泄漏并不是指內(nèi)存在物理上的消失,而是應(yīng)用程序在分配某塊內(nèi)存后,因?yàn)樵O(shè)計(jì)錯(cuò)誤,失去了對(duì)該內(nèi)存的控制,因而造成了內(nèi)存的泄漏
內(nèi)存泄漏的危害:長(zhǎng)期運(yùn)行的程序出現(xiàn)內(nèi)存泄漏,會(huì)造成程序越來(lái)越卡,最終會(huì)出現(xiàn)卡死的現(xiàn)象
對(duì)內(nèi)存的申請(qǐng)和使用是在學(xué)習(xí)的過(guò)程中必不可少的,但是在使用的時(shí)候,我們應(yīng)該要學(xué)會(huì)正確的使用,防止造成內(nèi)存泄漏等問(wèn)題
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
文章標(biāo)題:面試官:小伙子,說(shuō)說(shuō)C/C++是如何進(jìn)行內(nèi)存管理的?我:……-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://chinadenli.net/article46/dhjieg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、微信公眾號(hào)、搜索引擎優(yōu)化、品牌網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容