2.malloc、calloc、realloc底層實現原理
2.2 calloc底層實現原理
2.3 realloc底層實現原理
2.4 分配虛擬記憶體的細節
2.5 free函式實現原理
3.new/delete底層實現
4.相關面試題
3.應用
1)棧上的分配極為簡單,移動一下棧指標而已。2.1.2.1 malloc小於128k的記憶體,使用brk分配2)棧上的釋放也極為簡單,函式執行結束時移動一下棧指標即可。
3)由於後進先出的執行過程,不可能出現記憶體碎片。
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 物件模...