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

C++ new 三大用法深度解析:new operator、operator new、placement new 的區別與協作

     編輯:關於C語言

三種 new 的核心職責對比

形式功能是否分配內存是否調用構造函數典型用途
new Operator「分配 + 構造」一站式是是日常 99% 場景
operator new僅分配原始內存是否自定義內存池、延遲構造
placement new在已有內存上構造對象否是(調用拷貝/移動構造)對象池、共享內存、嵌入式定點構造

完整可編譯演示代碼

Emp.h

#ifndef _EMP_H_
#define _EMP_H_
class Emp {
public:
    Emp();
    Emp(const Emp& other);  // 拷貝構造
    ~Emp();
};
#endif

Emp.cpp

#include "Emp.h"
#include <iostream>
using namespace std;

Emp::Emp() { cout << "Emp..." << endl; }
Emp::Emp(const Emp& other) { cout << "Copy Emp..." << endl; }
Emp::~Emp() { cout << "~Emp..." << endl; }

main.cpp

#include "Emp.h"
#include <iostream>
using namespace std;

int main() {
    // 1. new operator:分配 + 默認構造
    Emp* e1 = new Emp;           // 輸出: Emp...

    // 2. operator new:僅分配 sizeof(Emp) 字節原始內存
    Emp* e2 = (Emp*)operator new(sizeof(Emp));  // 無輸出

    // 3. placement new:在 e2 指向的內存上調用拷貝構造函數
    new ((void*)e2) Emp(*e1);    // 輸出: Copy Emp...

    // 4. 顯式調用析構函數(placement new 必須手動析構)
    e2->~Emp();                  // 輸出: ~Emp...

    // 5. 僅釋放內存,不調用析構(配對 operator new)
    operator delete(e2);         // 無輸出

    // 6. 標準 delete:析構 + 釋放(配對 new operator)
    delete e1;                   // 輸出: ~Emp...

    return 0;
}

運行輸出與生命周期圖解

Emp...           ← e1 默認構造
Copy Emp...      ← e2 placement new 拷貝構造
~Emp...          ← e2 顯式析構
~Emp...          ← e1 delete 析構

關鍵規則與避坑指南

  • 配對原則:new operator 配 delete;operator new 配 operator delete;placement new 配 顯式析構函數調用 + operator delete(若內存由 operator new 分配)。
  • placement new 不分配內存,傳入的地址必須合法、對齊、且生命周期覆蓋對象使用期。
  • 拷貝構造 vs 默認構造:placement new 通常調用拷貝/移動構造(如示例),也可調用其他構造函數:new (ptr) Emp(arg1, arg2)。
  • 嵌入式/共享內存場景:在固定地址(如硬件寄存器映射區、共享內存段)構造對象,placement new 是唯一標準方式。

自定義 operator new/delete 實現內存池

void* operator new(size_t size) {
    // 從預分配內存池切塊,失敗拋 bad_alloc
}
void operator delete(void* ptr) noexcept {
    // 歸還內存池
}

重載後,所有 new Type 自動使用內存池,delete ptr 自動歸還,**業務代碼零修改**即可實現高性能定長分配。

總結

理解 new 三部曲,本質是理解 內存分配、對象構造、對象析構、內存釋放 四個階段的組合與解耦。日常用 new/delete,性能敏感處用 operator new/delete 搭建池,特殊地址構造用 placement new,三者各司其職,構建 C++ 內存管理的完整拼圖。

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