C 之記憶體模型 記憶體區域

2021-10-11 08:52:30 字數 2342 閱讀 3079

2.malloc、calloc、realloc底層實現原理

2.2 calloc底層實現原理

2.3 realloc底層實現原理

2.4 分配虛擬記憶體的細節

2.5 free函式實現原理

3.new/delete底層實現

4.相關面試題

3.應用

1)棧上的分配極為簡單,移動一下棧指標而已。

2)棧上的釋放也極為簡單,函式執行結束時移動一下棧指標即可。

3)由於後進先出的執行過程,不可能出現記憶體碎片。

2.1.2.1 malloc小於128k的記憶體,使用brk分配

2.1.2.2 malloc大於128k的記憶體,使用mmap分配(munmap釋放)

/*

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)

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

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

2)不同之處:new在申請空間失敗時會拋異常,malloc在申請空間失敗時會返回null。

1)new的原理:先呼叫operator new函式申請空間,然後在申請的空間上執行建構函式,完成物件的構造;

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

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

3)new[n]的原理:呼叫operator new函式,在operator new中實際呼叫operator new函式完成n個物件空間的申請;在申請的空間上執行n次建構函式;還有new[n]的時候需要在p的前四個位元組寫入陣列大小,然後呼叫n次建構函式,所以說對於複雜型別new會額外儲存陣列大小

4)delete[n]的原理:在釋放的物件空間上執行n次析構函式,完成n個物件中資源的清理;呼叫operator delete釋放空間,實際在operator delete中呼叫operator delete來釋放空間;

1)計數法:使用new或者malloc時,讓該數+1,delete或free時,該數-1,程式執行完列印這個計數,如果不為0則表示存在記憶體洩露。

2)一定要將基類的析構函式宣告為虛函式。

3)物件陣列的釋放一定要用delete 。

4)有new就有delete,有malloc就有free,保證它們一定成對出現。

#include

using

namespace std;

intf

(int n)

void

func

(int param1,

int param2)

intmain

(int argc,

char

* ar**)

//輸出結果

//2//1

//var1=1,var2=2

#include

char

*mystring()

;char

*s="hello world"

;for

(int i=

0;i<

sizeof

(buffer)-1

;i++

)return buffer;

}int

main()

//存在的問題:在mystring函式中,buffer是區域性變數。

//隨著函式結束,棧區記憶體釋放,字元陣列也就不存在。

//因此產生野指標,輸出結果未知。

c 之記憶體模型

c 程式在執行時,將記憶體大方向劃分為4個區域 區 存放函式體的二進位制 由作業系統進行管理 你寫的 都轉化成二進位制 全域性區 存放全域性變數和靜態變數以及常量 棧區 由編譯器自動分配和釋放,存放函式的引數值,區域性變數等 堆區 由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統 記...

面試之記憶體模型

2.記憶體模型中的可見性,原則性,有序性 原子性 多執行緒情況下 原子性是指乙個操作是不可中斷的。即使是在多個執行緒一起執行的時候,乙個操作一旦開始,就不會被其他執行緒干擾。用i 來做為舉例,需要read,load,use,等等的操作,單個操作是原子性的,但是對應整個操作i 來說是不能保證原子性的,...

C 物件模型之記憶體布局

c 虛函式表解析 虛函式按照其宣告順序放於表中 父類的虛函式在子類的虛函式前面 覆蓋的函式被放到了虛表中原來父類虛函式的位置 沒有被覆蓋的函式依舊 每個父類都有自己的虛表 子類的成員函式被放到了第乙個父類的表中 所謂的第乙個父類是按照宣告順序來判斷的 待補充 c 物件模型之記憶體布局 1 c 物件模...