placement new允许在已分配的内存上构造对象,适用于内存池等需精确控制内存的场景,使用时需先准备内存再调用new(地址)构造对象,并手动调用析构函数,整个过程避免了动态内存分配的开销和碎片问题,完整实现了对象生命周期的精细管理。

Placement new是一种C++的特殊语法,它允许你在已分配好的内存上直接构造对象,而不是像常规
new那样同时负责内存分配和对象构造。这对于内存池、共享内存或需要精确控制对象生命周期的场景非常有用。
解决方案
说起来,我第一次深入理解
placement new,是在处理一个嵌入式系统项目时。当时我们面对的挑战是,既要避免频繁的堆内存分配(那会引入碎片和不可预测的延迟),又要能在特定的内存区域里创建对象。
placement new简直就是为这种场景量身定制的。
它的核心思想很简单:你提供一块已经准备好的内存地址,然后告诉C++编译器:“嘿,就在这个地址上,帮我把这个对象构造出来。”
具体怎么用呢?分两步走:
-
准备内存:你需要一块足够大、并且内存对齐的原始内存区域。这块内存可以是栈上的数组,也可以是
malloc
或者其他自定义内存分配器提供的堆内存。#include
#include #include // 必须包含这个头文件 class MyClass { public: int value; std::string name; MyClass(int v, const std::string& n) : value(v), name(n) { std::cout << "MyClass(" << value << ", \"" << name << "\") 构造" << std::endl; } ~MyClass() { std::cout << "MyClass(" << value << ", \"" << name << "\") 析构" << std::endl; } void print() const { std::cout << "值: " << value << ", 名字: " << name << std::endl; } }; int main() { // 1. 准备一块足够大的内存,确保能容纳MyClass对象 // 注意:这里只是一个原始字节数组,没有构造任何对象 // 实际应用中,你可能从内存池或者共享内存中获取这块地址 char buffer[sizeof(MyClass)]; // 栈上分配 // 2. 使用 placement new 在 buffer 上构造 MyClass 对象 // 语法:new (地址) 类型(构造函数参数); MyClass* obj1 = new (buffer) MyClass(10, "Hello Placement New"); obj1->print(); // 3. !!重要!! 手动调用析构函数 // 对于 placement new 构造的对象,不能使用 delete // 因为 delete 会尝试释放内存,而这块内存我们是自己管理的 obj1->~MyClass(); //








