placement new的用法与注意事项
解释placement new的语法、用途和必须注意的事项。placement new不分配内存,那它做了什么?为什么必须显式调用析构函数?如何配合内存池使用?
回答
我是大山
Placement new语法:new (address) Type(args...)——在已分配的指定内存地址上构造对象,不分配堆内存。它只调用构造函数(在该地址上初始化对象)。关键注意:不能用普通delete释放placement new创建的对象(因为delete会释放内存),必须手动调用析构函数obj->~Type()。如果内存来自内存池/栈缓冲区/共享内存,需由分配器管理其释放。典型场景:1)内存池或定制分配器——提前分配大块内存,通过placement new逐个构造对象;2)std::vector的实现(用allocator分配未初始化内存后在插入时placement new构造);3)共享内存中的对象构造。C++17起可以使用std::construct_at替代placement new。注意:必须有对应的#include <new>。