动态存储区
动态存储区:
动态存储区即堆(Heap),由程序员手动申请和释放,生命周期由代码控制。
普通 new / delete
new 做两件事:从堆上申请内存 + 调用构造函数。
delete 做两件事:调用析构函数 + 释放堆内存。
int* p = new int(42); // 申请 + 初始化
delete p; // 析构 + 释放
int* arr = new int[10]; // 申请数组
delete[] arr; // 必须用 delete[],否则 UBnew失败时抛出std::bad_alloc异常(不像malloc返回nullptr)new/delete与malloc/free不能混用
定位 new(Placement new)
定位 new 在指定地址上构造对象,不申请新内存。需要 #include <new>。
#include <new>
char buf[sizeof(MyClass)]; // 预备内存(栈/全局/已申请的堆均可)
MyClass* p = new (buf) MyClass(); // 在 buf 上构造,不分配内存注意:
- 不能
delete p,因为没有申请堆内存 - 有析构函数的类必须手动调用析构:
p->~MyClass(); - 内存够不够由你保证,定位 new 不检查
// 配合堆内存的完整用法
char* heap_buf = new char[sizeof(MyClass)];
MyClass* obj = new (heap_buf) MyClass();
obj->~MyClass(); // 1. 手动析构
delete[] heap_buf; // 2. 释放原始内存典型用途: 内存池——预先申请一大块内存,用定位 new 在其中构造对象,避免频繁调用堆分配,嵌入式中常见。