在 C++ 中,placement new 是一种特殊的 new
操作符,用于在指定的内存地址上构造对象,而不是从堆上分配新内存。这在需要精细控制内存布局或在预分配的缓冲区中构造对象时非常有用,比如在嵌入式系统、内存池或自定义分配器中。
void* buffer = operator new(sizeof(MyClass)); // 手动分配原始内存 MyClass* obj = new (buffer) MyClass(); // 在指定地址上构造对象
这里的 new (buffer) MyClass()
就是 placement new,它不会分配内存,只是在 buffer
指向的内存上调用构造函数。
使用场景
-
内存池管理:提前分配一大块内存,然后用 placement new 在其中构造多个对象。
-
嵌入式开发:避免动态内存分配,提高性能和确定性。
-
自定义容器:如
std::vector
在扩容时会使用 placement new 构造新元素。
使用 placement new 后,必须手动调用析构函数来销毁对象:
obj->~MyClass(); // 手动析构 operator delete(buffer); // 释放原始内存
-
不调用析构函数可能会导致资源泄漏。
-
不要在同一地址上重复使用 placement new 构造对象,除非你先销毁旧对象。