本文目錄
- 1 記憶體分布圖
- 2 C語言和C++記憶體分配實作
- 2.1 C語言實作
- 2.2 C++實作
- 3 C語言和C++記憶體管理區別
- 4 記憶體泄漏
1 記憶體分布圖

注意:
1.向下生長:地址由高到低
2.向上生長:地址由低到高
3.堆疊又叫堆疊,非靜態區域變數/函式引數/回傳值等等
4.堆用于程式運行時動態記憶體分配
2 C語言和C++記憶體分配實作
2.1 C語言實作
malloc函式
void *malloc(size_t size)
- 分配所需的記憶體空間,單位是位元組,并回傳一個指向它的指標,
int* ptr_int = (int*)malloc(4*sizeof(int));//開辟空間
free(ptr_int);//釋放空間
calloc函式
void *calloc(size_t nitems, size_t size)
- 分配所需的記憶體空間,并回傳一個指向它的指標,nitems – 要被分配的元素個數,size – 元素的大小,malloc 和 calloc 之間的不同點是,malloc 不會設定記憶體為零,而 calloc 會設定分配的記憶體為零,
char* ptr_char = (char*)calloc(4, sizeof(char));
free(ptr_char);
realloc
void *realloc(void *ptr, size_t size)
- 嘗試重新調整之前呼叫 malloc 或 calloc 所分配的ptr 所指向的記憶體塊的大小,ptr – 指標指向一個要重新分配記憶體的記憶體塊,該記憶體塊之前是通過呼叫 malloc、calloc 或 realloc 進行分配記憶體的,如果為空指標,則會分配一個新的記憶體塊,且函式回傳一個指向它的指標,
size – 記憶體塊的新的大小,以位元組為單位,如果大小為 0,且 ptr 指向一個已存在的記憶體塊,則 ptr 所指向的記憶體塊會被釋放,并回傳一個空指標,
int* ptr_int = (int*)malloc(4*sizeof(int));
char* ptr_char = (char*)calloc(4, sizeof(char));
int* ptr_int1 = (int*)realloc(ptr_int, 8 * sizeof(int));
char* ptr_char1 = (char*)realloc(ptr_char, 8 * sizeof(char));
2.2 C++實作

new和delete的實作原理
1 內置型別
- 如果申請的是內置型別的空間,new和malloc,delete和free基本類似,不同的地方是:new/delete申請和釋放的是單個元素的空間,new[]和delete[]申請的是連續空間,而且new在申請空間失敗時會拋例外,malloc會回傳NULL,
2 自定義型別
new的原理
- 呼叫operator new函式申請空間
- 在申請的空間上執行建構式,完成物件的構造
delete的原理
- 在空間上執行解構式,完成物件中資源的清理作業
- 呼叫operator delete函式釋放物件的空間
3 C語言和C++記憶體管理區別
malloc/free和new/delete的共同點是:都是從堆上申請空間,并且需要用戶手動釋放,不同的地方是:
- malloc和free是函式,new和delete是運算子
- malloc申請的空間不會初始化,new可以初始化
- malloc申請空間時,需要手動計算空間大小并傳遞,new只需在其后跟上空間的型別即可
- malloc的回傳值為void*, 在使用時必須強轉,new不需要,因為new后跟的是空間的型別
- malloc申請空間失敗時,回傳的是NULL,因此使用時必須判空,new不需要,但是new需要捕獲例外
- 申請自定義型別物件時,malloc/free只會開辟空間,不會呼叫建構式與解構式,而new在申請空間后會呼叫建構式完成物件的初始化,delete在釋放空間前會呼叫解構式完成空間中資源的清理
4 記憶體泄漏
什么是記憶體泄漏:
記憶體泄漏指因為疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況,記憶體泄漏并不是指記憶體在物理上的消失,而是應用程式分配某段記憶體后,因為設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費,
記憶體泄漏的危害:長期運行的程式出現記憶體泄漏,影響很大,如作業系統、后臺服務等等,出現記憶體泄漏會導致回應越來越慢,最終卡死,
堆記憶體泄漏(Heap leak)
堆記憶體指的是程式執行中依據須要分配通過malloc / calloc / realloc / new等從堆中分配的一塊記憶體,用完后必須通過呼叫相應的 free或者delete 刪掉,假設程式的設計錯誤導致這部分記憶體沒有被釋放,那么以后這部分空間將無法再被使用,就會產生Heap Leak,
系統資源泄漏
指程式使用系統分配的資源,比方套接字、檔案描述符、管道等沒有使用對應的函式釋放掉,導致系統資源的浪費,嚴重可導致系統效能減少,系統執行不穩定,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293964.html
標籤:其他
上一篇:c語言實作順序表(初階資料結構)
