首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Linux C++ 記憶體管理精髓:指標傳遞陷阱、雙重指標、野指標、new/delete vs malloc/free

     編輯:更多程式設計知識

C++ 記憶體管理是面試與實戰高頻考點。本文系統梳理指標參數傳遞機制、動態配置正確姿勢、野指標成因與防禦、new/delete 與 malloc/free 本質差異。

一、指標參數傳遞:為何單層指標無法輸出配置記憶體?

void GetMemory(char* p, int n) {
    p = malloc(n); // 僅修改區域副本 _p,呼叫端 p 不變
}
char* str = NULL;
GetMemory(str, 100); // str 仍為 NULL → strcpy 崩潰

原因:參數傳值,編譯器建立副本 _p = p。函數內修改 _p 指向新記憶體,原 p 不變。

二、正確輸出配置記憶體的三種方案

方案 1:雙重指標(指標的指標)

void GetMemory2(char** p, int n) { *p = malloc(n); }
char* str = NULL;
GetMemory2(&str, 100); // 傳址,修改 *p 即修改 str

方案 2:函數回傳值(最推薦,簡單直觀)

char* GetMemory3(int n) { return malloc(n); }
char* str = GetMemory3(100);

方案 3:參考(C++ 專屬)

void GetMemory4(char*& p, int n) { p = malloc(n); } // 參考即別名
GetMemory4(str, 100);

三、回傳指標的致命陷阱:棧記憶體

char* GetString() {
    char p[] = "hello"; // 區域陣列在棧上
    return p; // 警告:回傳區域變數位址
}
// 呼叫端拿到的是已失效記憶體 → 垃圾值
  • 正確:回傳 malloc/new 的堆記憶體、靜態/全域變數、字串常值
  • 字串常值 char* p = "hello"; 位於唯讀資料段,生命週期全程,但不可修改

四、野指標三大成因與防禦

if (p != nullptr) 無法偵測野指標(位址非空但無效)。

五、new/delete vs malloc/free

成因範例防禦
未初始化int* p;宣告即初始化:int* p = nullptr;
釋放後未置空free(p); // p 成野指標free(p); p = nullptr;
超出作用域{ int a; p=&a; } p->func();勿回傳/儲存區域物件位址,用智慧指標管理生命週期

原則:C++ 物件必須用 new/delete;POD 型別可互換但不可混用(new 配 free、malloc 配 delete 皆未定義行為)。保留 malloc/free 為相容 C 庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性new/deletemalloc/free
本質運算子(編譯器支援)標準庫函數
建構/解構自動呼叫 constructor/destructor不支援,需手動 Initialize()/Destroy()
型別安全自動推導型別、回傳正確指標回傳 void* 需強制轉型
失敗處理拋出 bad_alloc 例外回傳 NULL
記憶體不足自訂處理set_new_handler無標準機制
陣列支援new T[n] / delete[]手動計算 n*sizeof(T)