內存管理是系統級開發的核心竄。本文涵蓋 malloc/free 底層機制、new/delete 語義差異、內存池設計、碎片成因與對策、Sanitizer/Valgrind 工具鏈、嵌入式/實時系統特殊考量。
main_arena + 多 thread_arena (無鎖/細粒度鎖)。malloc_trim 歸還 OS (madvise/munmap)。size_t size | flags (含 PREV_INUSE, IS_MMAPPED, NON_MAIN_ARENA)。| 維度 | malloc/free | new/delete |
|---|---|---|
| 類型安全 | ❌ 返回 void* | ✅ 返回 T* |
| 構造/析構 | ❌ 手動 | ✅ 自動調用 |
| 失敗處理 | 返回 NULL | 拋出 std::bad_alloc |
| 重載 | ❌ | ✅ 全局/類級 operator new |
| 數組 | 手動計算大小 | new T[n] / delete[] |
| 內部實現 | 直接系統調用 | 通常調用 malloc + 構造 |
// 簡單定長內存池
template
class Pool {
struct Node { Node *next; alignas(T) char data[sizeof(T)]; };
Node *free_list = nullptr;
std::vector chunks;
public:
T* allocate() {
if (!free_list) {
void *chunk = malloc(BlockSize);
chunks.push_back(chunk);
Node *n = (Node*)chunk;
for (size_t i = 0; i < BlockSize/sizeof(Node); ++i) {
n[i].next = free_list; free_list = &n[i];
}
}
Node *n = free_list; free_list = n->next;
return (T*)n->data;
}
void deallocate(T *p) {
Node *n = (Node*)p; n->next = free_list; free_list = n;
}
~Pool() { for (void *c : chunks) free(c); }
};
優勢:O(1) 分配釋放、零碎片、緩存局部性好、無鎖 (單線程池)。
適用:高頻小對象 (節點、網絡包、遊戲實體)。
| 類型 | 成因 | 對策 |
|---|---|---|
| 外部碎片 | 釋放後留下不可用小洞 | 內存池、Buddy System、jemalloc/tcmalloc 分級分配 |
| 內部碎片 | 分配單元大於請求大小 | 精確尺寸類、可變塊分配器 |
| 堆膨脹 | 長期運行釋放不歸還 OS | malloc_trim、MALLOC_TRIM_THRESHOLD、周期性重啟 |