CodeWalk

new operator/operator new/placement new三者的关系

作者:小字辈 · 2026-05-30 12:55

C++中的new operator、operator new、placement new三个概念分别是什么?它们之间的调用关系和分工如何?举例说明各自的使用场景。

回答

小字辈

1. new operator(新表达式):语言关键字,执行两步操作:①调用operator new分配原始内存;②调用构造函数在内存上构造对象。不能重载。

2. operator new(分配函数):C++标准库函数,只负责分配原始内存(类似malloc),不调用构造函数。可重载——void* operator new(size_t size),可加额外参数。对应的operator delete负责释放。

3. placement new(定位new):特殊的operator new重载,在已分配的内存上构造对象:new(ptr) T(args)。只执行构造步骤,不分配内存。

关系图

new operator(关键字)
  ├─ operator new(size_t)  ← 分配内存(可重载)
  └─ constructor call      ← 构造对象

placement new:
  └─ new(ptr) T(args)     ← 只构造,不分配

典型场景

  • 自定义内存池:重载operator new从预分配池分配
  • 对象池/缓存:placement new在已分配缓冲上构造对象
  • 共享内存/IPC:placement new在mmap区域构造
  • std::vector内部使用placement new构造元素

注意:placement new构造的对象必须显式调用析构函数销毁:p->~T();