C C 記憶體管理

2021-09-25 18:01:11 字數 3840 閱讀 7582

c/c++記憶體管理

c/c++記憶體分布

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

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

3. 堆用於程式執行時動態記憶體分配,堆是可以上增長的。

4. 資料段--儲存全域性資料和靜態資料。

5. **段--可執行的**/唯讀常量。

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

2.1 malloc /calloc / realloc和free

1、malloc()

宣告:void * malloc(int n);

含義:在堆上,分配n個位元組,並返回void指標型別。

初始化:未初始化

2、calloc()

宣告:void *calloc(int n, int size);

含義:在堆上,分配nsize個位元組,並初始化為0,返回void 型別

返回值:同malloc() 函式

初始化:已初始化

3、realloc()

宣告:void * realloc(void * p,int n);

含義:重新分配堆上的void指標p所指的空間為n個位元組,同時會複製原有內容到新分配的堆上儲存空間。注意,若原來的void指標p在堆上的空間不大於n個位元組,則保持不變。

返回值:同malloc() 函式

初始化:未初始化

4、free()

宣告:void free (void * p);

含義:釋放void指標p所指的堆上的空間。

返回值:無

申請失敗:null,使用時必須判空

不同點

1. malloc和free是函式,new和delete是操作符

2. malloc申請的空間不會初始化,new可以初始化

3. malloc申請空間時,需要手動計算空間大小並傳遞,new只需在其後跟上空間的型別即可

4. malloc的返回值為void*, 在使用時必須強轉,new不需要,因為new後跟的是空間的型別

5. malloc申請空間失敗時,返回的是null,因此使用時必須判空,new不需要,但是new需要捕獲異常

6. 申請自定義型別物件時,malloc/free只會開闢空間,不會呼叫建構函式與析構函式,而new在申請空間 後會呼叫建構函式完成物件的初始化,delete在釋放空間前會呼叫析構函式完成空間中資源的清理

a:size>=oldsize:

b.size<= old size

1)將原空間縮小

2 )返回舊空間首位址

3.c++記憶體管理方式

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

3.1 new/delete操作內建型別,申請和釋放單個記憶體的空間

void test()

new[ ]和delete[ ],申請和釋放連續的空間

3.2 new和delete操作自定義型別

class test

~test()

private:

int _data;

};void test2()

void test2()

malloc/free  、new/delete 、 new[ ]/delete[ ]

這三組要一一匹配,否則可能會造成記憶體洩漏或者**崩潰。

4.operator new 與operator delete函式

4.1 operator new 與 operator delete函式

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

operator new 與 operator delete函式

//operator new :該函式實際通過malloc來申請空間,當malloc申請空間成功時直接返回;申請失敗,嘗試執行空間不足應對措施,如果該應對措施使用者設定了,則繼續申請,否則拋異常

void * _crtdecl operator new (size_t size) _throw1(_std bad_alloc)

return (p);}

//operator delete: 該函式最終是通過free來釋放空間的

void operator delete(void *puserdata)

//free的實現

#define free(p) _free_dbg(p, _normal_block)

通過上述兩個全域性函式的實現知道,operator new 實際也是通過malloc來申請空間,如果malloc申請空間 成功就直接返回,否則執行使用者提供的空間不足應對措施,如果使用者提供該措施就繼續申請,否則就拋異 常。operator delete 最終是通過free來釋放空間的。

5. new和delete的實現原理

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

5.2 自定義型別

new的原理

1. 呼叫operator new函式申請空間 

void* operator new(size- tsize)-->迴圈呼叫malloc申請空間

>> malloc 成功 -->直接返回

>>malloc 失敗  -->系統堆記憶體空間不足,導致malloc失敗

空間不足的應對措施是否提供:提供:執行應對措施

未提供:拋異常bad_alloc

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

delete的原理

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

new t[n]的原理

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

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

delete的原理

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

2. 呼叫operator delete釋放空間,實際在operator delete中呼叫operator delete來釋放空間

6.在堆上一次申請4g的記憶體

#include using namepace std;

int main()

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