C C 記憶體管理

2021-09-27 10:18:24 字數 2611 閱讀 1507

區域

說明核心空間

使用者**不能編寫

棧向下增長,由編譯器自動分配釋放

記憶體對映段

檔案對映、動態庫、匿名對映

堆向上增長,一般由程式設計師分配釋放

資料段全域性資料、靜態資料,靜態區(全域性區)

**段可執行**、唯讀常量

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

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

堆用於程式執行時動態記憶體分配,向上增長。

資料段,儲存全域性資料和靜態資料。

**段,儲存可執行的**、唯讀常量。

malloc/calloc/realloc/free,是c標準提供的實現堆上記憶體管理的函式,包含於標頭檔案stdlib.h。

void

*malloc

(size_t size)

;

在記憶體的動態儲存區中分配一塊長度為size位元組的連續區域,返回指向所申請區域的第乙個位元組的指標,即返回該區域的位址,若記憶體申請失敗(記憶體不夠),則返回空指標null;並且不對申請的空間進行初始化。

void

*calloc

(size_t num, size_t size)

;

與malloc類似,size為申請位址的單元元素長度,num是引數個數。

即為乙個大小為num的陣列申請記憶體,每個元素的大小是size,將每個元素初始化為0,同時返回該區域的位址。若記憶體申請失敗,則返回空指標null。

void

*realloc

(void

*ptr, size_t size)

;

給乙個已經分配了的位址的指標重新分配空間,原有空間的位址為ptr,重新申請的位址空間大小為size個位元組。

可以對給定的指標所指向的空間進行擴大或縮小,原有的記憶體中內容不變。新的記憶體空間和原來的記憶體空間不一定時同一記憶體位址,返回的指標可能指向新的位址。

void

free

(void

*ptr)

;

用於釋放由malloc/calloc/realloc申請的記憶體空間。

申請的空間不可以二次釋放。

c語言記憶體管理方式在c++中也可以繼續使用,而c++提出自己的記憶體管理方式:通過new和delete操作符進行動態記憶體管理。

申請和釋放單個元素的空間,使用new和delete操作符,申請和釋放連續的空間,使用new和delete。

針對內建型別

void

test()

針對自定義型別
class

test

~test()

private

:int _data;};

void

tests()

在申請自定義型別的空間時,new會呼叫建構函式,delete會呼叫析構函式,而malloc與free不會。

operator new與operator delete函式

new和delete是使用者進行動態記憶體申請和釋放的操作符,operator new 和operator delete則是系統提供的全域性函式,new在底層呼叫operator new這個全域性函式來申請空間,delete在底層通過operator delete這個全域性函式來釋放空間。

**operator new:**該函式底層實際通過malloc來申請空間,當malloc申請空間成功時直接返回;如果申請空間失敗,則執行使用者提供的空間不足應對措施,如果使用者提供該措施就繼續申請,否則丟擲bad_alloc型別異常。

operator delete:該函式底層依舊是通過free來釋放空間的。

new和delete的實現原理

內建型別

如果申請的是內建型別的空間,new和malloc,delete和free基本類似;

new/delete申請和釋放單個元素的空間,new和delete申請連續空間,new在申請空間失敗時拋異常,malloc則返回null。

自定義型別

new

呼叫operator new函式申請空間,並執行建構函式。

delete

呼叫operator delete函式釋放空間,執行析構函式,完成物件中資源的清理工作。

new t[n]

呼叫operator new函式,在operator new中實際呼叫operator new函式完成n個物件空間的申請,在申請的空間上執行n次建構函式。

delete

呼叫operator delete釋放空間,在operator delete中呼叫operator delete來釋放空間,在釋放的物件空間上執行n次析構函式,完成n個物件中資源的清理。

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...