placement new 是在已分配内存上构造对象的C++特性,语法为 new (ptr) Type(args),常用于内存池、自定义分配器等场景,示例包括在栈或堆内存中调用构造函数。

在C++中,placement new 是一种特殊的 new 表达式,允许你在已经分配好的内存上构造对象。这种方式不会分配新的内存,而是使用你提供的内存地址来调用对象的构造函数。
什么是 placement new
placement new 的语法形式如下:
new (pointer_to_memory) Type(arguments)它接收一个指向已分配内存的指针,并在此内存位置上调用类型的构造函数。常用于以下场景:
- 内存池管理
- 自定义内存分配器
- 嵌入式系统或性能敏感场景
如何使用 placement new 构造对象
下面是使用 placement new 的基本步骤和示例:
立即学习“C++免费学习笔记(深入)”;
1. 预先分配内存
可以使用栈内存、堆内存或静态缓冲区。
char buffer[sizeof(MyClass)]; // 栈上分配 // 或者 void* memory = malloc(sizeof(MyClass)); // 堆上分配2. 在指定内存上调用 placement new
class MyClass { public: MyClass(int val) { std::cout // 使用示例 int main() { char buffer[sizeof(MyClass)];// 在 buffer 上构造对象 MyClass* obj = new (buffer) MyClass(42); // 调用成员函数 // ... // 显式调用析构函数(重要!) obj->~MyClass(); return 0;
}
注意事项与正确释放资源
由于 placement new 不分配内存,因此不能使用 delete 来释放对象。必须:
- 显式调用析构函数
- 自行管理底层内存的生命周期
例如,若内存来自 malloc,应在析构后调用 free:
void* raw_memory = malloc(sizeof(MyClass)); MyClass* obj = new (raw_memory) MyClass(100); // ... obj->~MyClass(); free(raw_memory);如果内存位于栈上,则无需额外释放,但对象作用域结束时必须手动调用析构函数。
常见用途:构建对象池
placement new 常用于实现对象池,避免频繁动态分配:
class ObjectPool { char pool[10 * sizeof(MyClass)]; bool used[10] = {false};public: MyClass allocate(int value) { for (int i = 0; i sizeof(MyClass)) MyClass(value); } } return nullptr; }
void deallocate(MyClass* obj) {
obj->~MyClass();
// 标记对应槽位为空
}};
基本上就这些。placement new 提供了对对象构造位置的精确控制,但需要开发者完全负责内存和生命周期管理。不复杂但容易忽略析构步骤。











