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

C++ new 建立物件與堆疊建立的差異、適用場景與記憶體管理

     編輯:關於C語言

初學者常困惑 new 與直接定義物件的差別。本文從記憶體模型、生命週期、效能、介面設計四維度對比,給出選擇指引。

核心差異對照

特性new Type() (堆積)Type obj; (堆疊)
記憶體區域Heap(自由存儲區)Stack(函式幀)
生命週期手動 delete 釋放離開作用域自動析構
指標/參考回傳指標,可跨函式傳遞、儲存僅限當前作用域,傳參需用參考/指標
大小限制受限於虛擬記憶體(GB 級)受限於堆疊大小(預設 1-8 MB)
配置速度較慢(尋找空閒區塊、同步鎖)極快(指標遞減)
釋放速度較慢(合併區塊、同步鎖)零成本(指標遞增)
例外安全需 RAII/智慧指標管理天然例外安全

適用場景決策樹

  1. 頻繁建立/銷毀的小型物件 → 堆疊(或物件池)。
    例:迴圈內 for (...) { Widget w; ... }
  2. 生命週期超出建立函式、需共享擁有權 → new + shared_ptr/unique_ptr。
    例:工廠函式回傳、容器儲存多型物件。
  3. 大型物件/陣列 → 堆積(避免堆疊溢位)。
  4. 效能關鍵路徑 → 堆疊或預先配置池(std::vector reserve、自定義 allocator)。
  5. C API 互操作需不透明指標 → new 回傳 void*,配對 delete 匯出函式。

程式碼範例

堆疊物件(推薦預設選擇)

class Test { public: int a; };
void foo() {
    Test obj;          // 自動配置、自動析構
    obj.a = 42;
} // obj 此處自動析構,零洩漏風險

堆積物件 + 智慧指標(現代 C++ 標準寫法)

#include 
std::unique_ptr create() {
    return std::make_unique(); // C++14
}
void bar() {
    auto p = create(); // 擁有權轉移
    p->a = 100;
} // 離開作用域自動 delete

傳統 new/delete(維護舊代碼時)

Test* p = new Test();
p->a = 10;
// ... 使用 ...
delete p;  // 必須配對,否則洩漏
p = nullptr;

指標作函式參數/回傳

class Best { public: int b; };
class Test { public: int a; };

Test* transform(Best* in) {
    Test* out = new Test();
    out->a = in->b;
    return out;  // 呼叫端負責 delete
}

常見錯誤與誤區

  • Type* p = nullptr; 僅宣告指標,**未配置記憶體**,不可直接 p->member。
  • 區域 new 未 delete → 記憶體洩漏(工具:Valgrind、Visual Studio CRT 偵測)。
  • 跨 DLL new/delete 若執行期庫不一致 → 堆積損壞(參考 malloc/free 失敗條目)。

總結

預設用堆疊 + RAII;需動態生命週期、多型、大型物件才用堆積,並務必搭配智慧指標。手動 new/delete 僅存在於 legacy 代碼或 C 介面邊界。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved