placement new用于在已分配内存上构造对象,不分配新内存。例如在栈或内存池中初始化对象,需确保内存对齐并手动调用析构函数。

在C++中,placement new 是一种特殊的 new 表达式,用于在**已分配的内存地址上构造对象**,而不是重新分配内存。它不分配内存,只负责调用构造函数,在指定位置初始化对象。
为什么需要 placement new?
有时候你已经有一块内存(比如来自栈、内存池或共享内存),但仍希望在这块内存上创建一个 C++ 对象。这时就需要 placement new,因为它允许你在给定地址上“就地”构造对象。
基本语法
new (pointer_to_memory) Type(arguments);
其中:
- pointer_to_memory:指向一块足够大且已分配的内存区域的指针。
- Type:要构造的对象类型。
- arguments:传递给构造函数的参数(可选)。
使用示例
下面是一个简单例子,展示如何在栈上的一块内存中使用 placement new 构造一个对象:
立即学习“C++免费学习笔记(深入)”;
#includestruct MyClass { int value; MyClass(int v) : value(v) { std::cout << "构造 MyClass, value = " << value << "\n"; } ~MyClass() { std::cout << "析构 MyClass, value = " << value << "\n"; } };
int main() { alignas(MyClass) char buffer[sizeof(MyClass)]; // 确保内存对齐并足够大
// 使用 placement new 在 buffer 上构造对象 MyClass* obj = new (buffer) MyClass(42); std::cout zuojiankuohaophpcnzuojiankuohaophpcn "obj-youjiankuohaophpcnvalue = " zuojiankuohaophpcnzuojiankuohaophpcn obj-youjiankuohaophpcnvalue zuojiankuohaophpcnzuojiankuohaophpcn "\n"; // 手动调用析构函数(重要!) obj-youjiankuohaophpcn~MyClass(); return 0;}
关键点说明
1. 内存必须预先分配
placement new 不会分配新内存。你必须确保传入的地址指向一块足够大且未被使用的内存。
2. 注意内存对齐
C++ 要求对象存储在正确对齐的地址上。使用 alignas 可以确保缓冲区满足类型对齐要求。
3. 必须手动调用析构函数
因为对象不是通过普通 new 创建的,所以不能用 delete。你必须显式调用析构函数来清理资源。
4. 常见应用场景
- 实现自定义内存池或对象池。
- 在共享内存中构造 C++ 对象。
- 嵌入式系统中精确控制内存布局。
- 标准库容器(如 std::vector)内部管理元素内存时也使用类似机制。
小结
placement new 的核心用途是:在指定内存位置构造对象,适用于需要精细控制内存管理的场景。记住:它只调用构造函数,不分配内存;相应地,你也必须手动调用析构函数,而不能使用 delete。
基本上就这些,用起来不复杂,但容易忽略对齐和析构的问题。











