new operator/operator new/placement new三者的关系
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();。