c c 記憶體管理

2021-09-27 06:41:12 字數 2388 閱讀 8801

1、c/c++中程式記憶體區域劃分

棧:又叫堆疊,儲存非靜態區域性變數/函式引數、返回值等等。棧是向下增長的;

記憶體對映段:最高效的i/o,用於裝載乙個共享的動態記憶體庫,使用者使用系統介面建立於共享記憶體,做程序間通訊;

堆:用於程式執行時動態非配記憶體,堆是向上增長的;

資料段:儲存全域性資料和靜態資料;

**段:可執行**和制度常量;

2、c語言中動態記憶體管理方式

函式原型 :

//函式原型 

void

*malloc

(size_t size)

;void

*calloc

(size_t num, size_t size)

;void

*realloc

(void

* p, size_t newsize)

;

函式功能:malloc()不能初始化所分配的空間,需要memset()進行初始化。如果這塊空間被初始化過,則可能遺留各種各樣的資料;

calloc()為num元素陣列分配乙個記憶體塊,每個元素的大小都是位元組長,並將其所有位初始化為零;

realloc()可以對所給的指標指向的空間進行擴大或者是縮小,原有的記憶體中內容將保持不變。realloc()申請的新的空間並且返回新申請的記憶體位址,釋放舊的空間;

注意:在堆上開的記憶體空間,用完之後必須使用free()釋放,否則會造成記憶體洩漏問題。但是在棧上開闢的空間,棧上的空間具有作用域在函式結束時會自動釋放,由編譯器保護不需要進行手動釋放。

3、c++記憶體管理

操作符 new 和 delete 進行動態記憶體管理

//操作符new和delete的基本用法

注意:4、new 和 delete的實現原理

內建型別:如果申請空間是內建型別的空間,new 和 malloc,delete 和 free基本類似;不同點是:new/delete申請和釋放的是單個元素空間,new[ ]/delete[ ]申請和釋放的是連續的空間、而且new在申請空間失敗時會拋異常,malloc會返回null。

自定義型別:

呼叫operator new函式申請空間

在申請的空間上執行建構函式,完成物件的構造

在空間上執行析構函式,完成物件中資源的清理工作

呼叫operator delete函式釋放物件空間

呼叫operator new[ ] 函式,在operator new [ ] 中實際呼叫operator new函式完成n個物件空間的申請

在申請的空間上執行n次建構函式

在釋放的物件空間上執行n此析構函式,完成n個物件中資源的清理

呼叫operator delete[ ] 釋放空間,實際在operator delete[ ] 中呼叫operator delete來釋放空間

注意:operator new 實際也是通過malloc來申請空間,如果malloc申請空間成功就直接返回,否則執行使用者提供的空間不足應對措施,如果使用者提供該措施就繼續申請,否則就拋異常。operator delete 最終是通過free來釋放空間的.

5、面試題辨析

malloc/free 和 new/delete 的區別

共同點是:都是從堆上申請空間,並且都需要手動釋放。

不同點是:

記憶體洩漏

c++/c程式中一般我們關心兩種方面的記憶體洩漏

如何檢測記憶體洩漏

不管是在linux下還是windows下都有相應的記憶體洩漏檢測工具。

如何避免記憶體洩漏

事前預防性。如智慧型指標等。

事後查錯型。如洩漏檢測工具。

以上是本人對c和c++部分理解,如有不足,虛心受教!

c c 記憶體管理

我一直覺得記憶體是很複雜的東西.也許我把這篇文章完成的時候,我會了解一點c 的記憶體管理機制 從硬體開始 記憶體器位址空間 匯流排位址空間 cpu位址空間 虛擬記憶體位址空間 程式位址空間 邏輯位址空間 程式位址空間對c 程式設計師來說是可見的,其他位址空間我們並不關心 通過列印pointer的值 ...

C C 記憶體管理

寫乙個好的c 程式,我們要懂得好多東西,比如說最基本的物件導向程式設計思想,c 的封裝 繼承 多型機制,設計模式等,還有乙個很重要的內容便是效能優化,像c c 這種接近底層的語言,追求的就是效能,與之相關的一項內容便是記憶體管理,記憶體分配要合理,禁止破壞記憶體,不能有記憶體洩漏,操作不好的話,程式...

C C 記憶體管理

1.相同點 失敗 null 2 使用之前都要進行判斷是否為空 3 釋放空間的方式 free 4 返回值 void 可以強制型別轉換 2.不同點 1 malloc 引數 位元組數 功能 負責將空間給出 2 calloc 引數 單個元素位元組數,元素個數 功能 給出空間,且對空間進行初始化為0 若p為n...