

新闻资讯
技术学院placement new 是 C++ 中不分配内存、仅在指定地址调用构造函数的 new 表达式;需手动调用析构函数,不可用 delete 销毁,常用于内存池、STL 容器及嵌入式系统。
placement new 是 C++ 中一种特殊的 new 表达式,它不分配内存,而是直接在你已提供的、预先分配好的内存地址上构造对象。
普通 new 会做两件事:调用 operator new 分配内存,再在该内存上调用构造函数。而 placement new 跳过第一步,只执行第二步——在你指定的地址上调用构造函数。
典型写法:
char buffer[sizeof(MyClass)];
MyClass* obj = new (buffer) MyClass(42); // 在 buffer 起始地址构造对象
因为 placement new 没有分配内存,所以不能用 delete 销毁对象——那会尝试释放未由 new 分配的内存,导致未定义行为。
obj->~MyClass();
malloc 或 operator new 分配的,之后还需手动 free 或 operator delete
buffer),则无需释放,但析构仍要手动调用std::vector 内部在已分配的原始内存上调用 placement new 构造元素placement new 本质是 operator new 的一个重载版本,签名为:
void* operator new(std::size_t, void* p) noexcept { return p; }这个版本不分配内存,只是原样返回传入的指针 p。编译器识别 new (pt 语法后,就会调用它。
r) T(...)
你也可以定义自己的带额外参数的 placement new(比如带对齐、日志等),只要提供对应 operator new 声明即可。
基本上就这些。它不复杂,但容易忽略手动析构和内存归属问题。