這裡首先對記憶體做簡單了解,然後總結malloc/free和new/delete的關係及差異,深度剖析new/delete以及模擬實現new/delete。
c/c++程式分配的記憶體
1. 棧區(stack):由編譯器自動分配釋放,存放函式區域性變數、函式引數、返回資料等。
2. 堆區(heap):一般由程式設計師分配釋放
3. 全域性區(靜態區static):存放全域性變數、靜態資料、常量。程式結束後由系統釋
4. 文字常量區 :
常量字串就是放在這裡的。 程式結束後由系統釋放。
5. 程式**區
—存放函式體(類成員函式和全域性函式)的二進位制**。
如下圖:
c語言動態記憶體管理
c語言使用malloc/calloc/realloc/free進行動態記憶體管理
malloc:void* malloc(size_t size);
分配成功返回乙個指向被分配的記憶體的起始位置的位址,分配失敗指向乙個空指標。因此,對每個從malloc返回的指標都進行檢查,確保它並非null是非常重要的。
calloc:void* calloc(size_t num_elements, size_t element_size)
malloc和calloc之間的區別是後者在返回指向記憶體的指標之前把它初始化為0.
realloc:void* realloc(void* ptr, size_t new_size)
realloc函式用於修改乙個原來已經分配的記憶體塊的大小。
幾種情況分析:
1.newsize2.newsize>size a.直接擴容 b.重新開闢新空間(拷貝&釋放舊空間 )這也是為什麼後malloc的位址不一定比新malloc的位址大。
free:void free(void* pointer)
注:free()不能釋放非動態開闢的空間。
常見的動態記憶體錯誤
1. 對分配的記憶體進行操作時越界訪問。
(在malloc和free的有些實現中,它們以鍊錶的形式維護可用的記憶體池。對分配的記憶體之外的區域進行訪問可能破壞這個鍊錶,這有可能產生異常,從而終止程式。)
2. 釋放非動態開闢的記憶體
3. 釋放動態記憶體的一部分。(冬天記憶體的開闢必須整塊一起釋放)
4. 對null指標進行解引用(動態記憶體分配最常見的錯誤就是忘記檢查所請求的記憶體是否成功分配)
5. 多次釋放同一塊動態記憶體以及一塊動態記憶體被釋放後繼續使用。(當對乙個指向動態分配的記憶體的指標進行複製)
6. 記憶體洩露(分配記憶體但在使用完畢後不釋放將引起記憶體洩露。)
c++動態記憶體管理
c++通過new和delete進行動態記憶體管理
new/delete動態管理物件
new/delete動態管理物件組
注:malloc/free、new/delete、new/delete一定要匹配使用,否則會記憶體洩露
什麼記憶體洩漏:
【深入理解c++動態記憶體管理 】
c++的其他記憶體管理介面(placeman版本):
void * operator new (size_t size);
void operator delete (size_t size);
void * operator new (size_t size);
void operator new (size_t size);
總結:
1. operator new/operator delete operator new/operator delete 和 malloc/free用法一樣
2. 他們只負責分配空間/釋放空間,不會呼叫物件建構函式/析構函式來初始化/清理物件。
3. 實際operator new和operator delete只是malloc和free的一層封裝。
new做了兩件事情:
1.呼叫operator new分配空間
2.呼叫建構函式初始化物件。
delete也做了兩件事情:
1.呼叫析構函式清理物件
2.呼叫operator delete釋放空間
new[n]
1. 呼叫operator new分配空間。
2.n次建構函式分別初始化每個物件。
delete
1. 呼叫n次析構函式清理物件
2. 呼叫operator delete釋放空間。
定位new表示式:
剖析new/delete
總結malloc/free和new/delete的區別與聯絡:
1. 它們都是動態管理記憶體的入口。
2. malloc/free是c/c++標準庫的函式,new/delete是c++操作符。
3. malloc/free只是動態分配記憶體空間/釋放空間。而new/delete除了分配空間還會呼叫建構函式和析構函式進行初始化與清理(清理成員)。
4. malloc/free需要手動計算型別大小且返回值會void*,new/delete可自己計算型別的大小,返回對應型別的指標。
5.malloc失敗返回異常 , new失敗丟擲異常。
實現new_array/delete_array巨集,模擬new/delete申請和釋放陣列。
//new(size_t n)
#define new(ptr,type)\
ptr = (type*)operator new(sizeof(type));\
new(ptr)type; //調構造
//delete
#define delete(ptr,type)\
ptr->~type();\
operator delete(ptr);
//new
#define new_array(ptr,type,n)\
do\operator delete((int*)ptr-1);\
}while(0);
C C 動態記憶體管理
一 c語言中動態記憶體管理方式 c語言中使用 malloc calloc realloc free進行記憶體的管理和釋放 1.malloc動態記憶體申請 int ptest int malloc 10 sizeof int 申請記憶體的方式 free 釋放 2.calloc 該函式會將申請的記憶體空...
C C 動態記憶體管理
注意malloc free new delete new delete一定要匹配使用,否則可能出現記憶體洩漏甚至崩潰的問題小結 1 兩組函式都負責動態記憶體管理 2 malloc free是c c 標準庫的函式,而new delete是c 操作符。3 malloc free只負責動態分配空間 釋放空...
C C 動態記憶體管理
c語言動態記憶體管理 malloc calloc realloc free int p1 int malloc sizeof int malloc返回值型別為void int p2 int calloc 1,sizeof int 動態分配並初始化為0 int p3 int realloc p1,si...