placement new是在已分配内存上构造对象的C++机制,不分配新内存,仅调用构造函数。常用于内存池、STL容器、嵌入式系统等需精细控制内存的场景。使用时需手动分配内存、显式调用析构函数,且不能用delete释放。注意内存对齐与对象生命周期管理,避免未定义行为。

在C++中,placement new 是一种特殊的 new 表达式,用于在已分配的内存上构造对象。它不会分配新的内存,而是在指定的内存地址上初始化一个对象。这种机制常用于需要精确控制内存管理的场景,比如自定义内存池、STL 容器实现或嵌入式系统开发。
什么是 placement new
placement new 是 operator new 的重载版本之一,其函数签名如下:
void* operator new(size_t size, void* ptr);这个版本不分配内存,而是直接返回传入的指针 ptr,并在此地址上调用构造函数来创建对象。
基本使用方法
使用 placement new 的步骤包括:手动分配原始内存、调用 placement new 构造对象、显式调用析构函数(因为不会自动释放)。
立即学习“C++免费学习笔记(深入)”;
示例代码:
#include iostream>using namespace std;
class MyClass {
public:
MyClass(int val) { cout
~MyClass() { cout
private:
int data;
};
int main() {
// 1. 分配原始内存
char buffer[sizeof(MyClass)];
// 2. 使用 placement new 构造对象
MyClass* obj = new(buffer) MyClass(42);
// 3. 显式调用析构函数
obj->~MyClass();
return 0;
}
输出结果:
构造: 42析构: 42
常见应用场景
placement new 主要用于以下几种情况:
- 内存池管理:预先分配一大块内存,然后在其中多次使用 placement new 创建对象,提升性能。
- 对象复用:在同一个内存位置反复构造和析构对象,避免频繁分配/释放内存。
- 嵌入式系统:需要将对象放置在特定地址(如硬件寄存器映射区域)时使用。
- STL 容器实现:vector 等容器在扩容时使用 placement new 在新内存中构造元素。
注意事项与陷阱
使用 placement new 时需特别注意以下几点:
- 必须手动调用析构函数,否则资源无法正确释放。
- 不能使用 delete 释放 placement new 创建的对象,因为它没有分配堆内存。
- 确保提供的内存空间足够大且对齐方式满足类型要求。
- 避免在同一内存上重复构造对象而不先析构,会导致未定义行为。
基本上就这些。placement new 提供了对对象构造过程的底层控制能力,适合高级用法,但需要开发者自行管理生命周期和内存安全。










