动态存储区

← 内存管理


动态存储区:

动态存储区即堆(Heap),由程序员手动申请和释放,生命周期由代码控制。

普通 new / delete

new 做两件事:从堆上申请内存 + 调用构造函数delete 做两件事:调用析构函数 + 释放堆内存

int* p = new int(42);       // 申请 + 初始化
delete p;                   // 析构 + 释放
 
int* arr = new int[10];     // 申请数组
delete[] arr;               // 必须用 delete[],否则 UB
  • new 失败时抛出 std::bad_alloc 异常(不像 malloc 返回 nullptr
  • new / deletemalloc / 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 在其中构造对象,避免频繁调用堆分配,嵌入式中常见。