溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++內(nèi)存管理的知識(shí)點(diǎn)有哪些

發(fā)布時(shí)間:2023-03-28 11:25:51 來源:億速云 閱讀:95 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“C++內(nèi)存管理的知識(shí)點(diǎn)有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C++內(nèi)存管理的知識(shí)點(diǎn)有哪些”吧!

1. 簡(jiǎn)述下C++的內(nèi)存分配方式。

  • 在C++中,內(nèi)存可以分為 5 個(gè)區(qū),分別為棧,堆,自由存儲(chǔ)區(qū),全局/靜態(tài)變量,常量存儲(chǔ)區(qū)。

  • (1):在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元在棧上創(chuàng)建,函數(shù)執(zhí)行完時(shí)這些存儲(chǔ)單元被自動(dòng)釋放。

  • (2):通過 malloc 分配的內(nèi)存塊,通常和 free 搭配,需要手動(dòng)釋放。

  • (3)自由存儲(chǔ)區(qū):通過 new 分配的內(nèi)存塊,通常和 delete 搭配,也需要手動(dòng)釋放。

  • (4)全局/靜態(tài)存儲(chǔ)區(qū):用于存儲(chǔ)全局變量和靜態(tài)變量。

  • (5)常量存儲(chǔ)區(qū):用于存放常量,不允許修改。

 2. 簡(jiǎn)述下棧和堆的區(qū)別。

  • (1)空間分配不同:棧存放函數(shù)內(nèi)的局部變量,由操作系統(tǒng)自動(dòng)釋放;堆通過 malloc 分配,需要手動(dòng)釋放。

  • (2)緩存方式不同:棧使用的是一級(jí)緩存,被調(diào)用時(shí)處于存儲(chǔ)空間;堆使用的是二級(jí)緩存,速度要慢些。

  • (3)數(shù)據(jù)結(jié)構(gòu)不同:棧類似棧結(jié)構(gòu),先進(jìn)后出;堆類似數(shù)組結(jié)構(gòu),先進(jìn)先出。

3. malloc 和局部變量分配在堆還是棧?

  • malloc 分配在堆中,他會(huì)分配一塊指定大小的內(nèi)存空間,并返回一個(gè)指針,使用完畢后需要手動(dòng)回收。

  • 局部變量分配在在棧中,超過作用域后系統(tǒng)自動(dòng)回收。

 4. 程序有哪些部分?分別的作用是什么?

  • (1)數(shù)據(jù)段:存放程序中已初始化的全局變量和靜態(tài)變量。

  • (2)代碼段:存放程序執(zhí)行代碼的一塊區(qū)域,頭部包含一些常數(shù)變量。

  • (3)BSS段:存放程序中未初始化的全局變量和靜態(tài)變量的一塊區(qū)域。

  • (4)可執(zhí)行程序在運(yùn)行時(shí)會(huì)多出兩個(gè)區(qū)域:

  • :動(dòng)態(tài)申請(qǐng)內(nèi)存用。從低向高增長(zhǎng)。

  • :存儲(chǔ)局部變量,函數(shù)參數(shù)值。從高向低增長(zhǎng)。

  • (5)在堆和棧之間有個(gè)文件映射區(qū)。

5. 程序的執(zhí)行過程是怎么樣的?

  • (1)操作系統(tǒng)創(chuàng)建相應(yīng)的進(jìn)程并分配進(jìn)程空間,加載器把可執(zhí)行文件中的代碼段,數(shù)據(jù)段映射到進(jìn)程中的虛擬空間。

  • (2)加載器讀入可執(zhí)行程序中的導(dǎo)入符號(hào)表,根據(jù)符號(hào)表可以查詢需依賴的動(dòng)態(tài)依賴庫。

  • (3)加載器將程序中的動(dòng)態(tài)依賴庫進(jìn)行導(dǎo)入。

  • (4)初始化應(yīng)用程序中的全局變量,對(duì)于全局變量自動(dòng)調(diào)用構(gòu)造函數(shù)。

  • (5)進(jìn)入程序入口函數(shù)開始執(zhí)行。

6. 初始化為 0 的全局變量在 bss 還是 data 區(qū)?

  • 數(shù)據(jù)區(qū):存放初始化不為 0 的全局變量和靜態(tài)變量。

  • BSS區(qū):存放初始化為 0 或未初始化的全局變量和靜態(tài)變量。

7. 什么是內(nèi)存泄漏?如何解決?

內(nèi)存泄漏:

  • 申請(qǐng)了一塊兒內(nèi)存空間,但是使用完畢后沒有釋放。

  • (1)new 和 malloc 申請(qǐng)后,沒有使用 delete 和 free 釋放。

  • (2)子類繼承父類時(shí),父類析構(gòu)函數(shù)不是虛函數(shù)。

  • (3)windows 句柄資源使用后沒有釋放。

對(duì)策:

  • (1)養(yǎng)成良好的編程習(xí)慣,分配的內(nèi)配使用后,記的釋放。

  • (2)將分配內(nèi)存的指針以鏈表的形式存儲(chǔ),使用完畢后從鏈表中刪除進(jìn)行管理。

  • (3)使用智能指針。

8. 常見的內(nèi)存錯(cuò)誤有哪些?

常見內(nèi)存錯(cuò)誤:

  • (1)內(nèi)存分配未成功卻使用。

  • (2)內(nèi)存分配成功,但是未初始化就引用。

  • (3)內(nèi)存分配成功并初始化,但是操作超出了內(nèi)存的邊界。

  • (4)忘記了釋放內(nèi)存,造成內(nèi)存泄漏。

  • (5)釋放了內(nèi)存卻繼續(xù)使用。

對(duì)策:

  • (1)用 malloc 或 new 申請(qǐng)內(nèi)存后,應(yīng)該檢查返回的指針是否為 NULL。

  • (2)為指針初始化為 NULL,為數(shù)組和動(dòng)態(tài)內(nèi)存賦初值。

  • (3)避免數(shù)組越界。

  • (4)動(dòng)態(tài)內(nèi)存的申請(qǐng)和釋放必須配對(duì)。

  • (5)用 free 和 delete 釋放內(nèi)存之后,指針應(yīng)該置空防止野指針。

  • (6)使用智能指針。

9. 什么是內(nèi)存對(duì)齊?

  • 為了能夠使 CPU 進(jìn)行快速的訪問,變量的起始地址應(yīng)該具有某些特征,即對(duì)齊。比如 4 字節(jié)的 int,起始地址應(yīng)該在 4 字節(jié)的邊界上。

  • 假如變量的地址不是自然對(duì)齊,那么 CPU 要訪問該值的話需要訪問兩次或三次內(nèi)存,而對(duì)齊的話只需要一次,訪問的速度更快。

  • 內(nèi)存對(duì)齊一般應(yīng)用在 struct,class,union 數(shù)據(jù)類型中。

感謝各位的閱讀,以上就是“C++內(nèi)存管理的知識(shí)點(diǎn)有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)C++內(nèi)存管理的知識(shí)點(diǎn)有哪些這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI