C++中new和delete怎么用?C++动态内存分配与释放【内存管理】

new 和 delete 是 C++ 中手动管理堆内存的操作符,负责申请/释放内存并自动调用构造/析构函数;需严格匹配使用,避免未定义行为,推荐优先使用智能指针和标准容器替代。

new 和 delete 是 C++ 中手动管理堆内存的核心操作符,不是函数,也不调用构造/析构函数以外的额外逻辑——它们负责在运行时申请和归还内存,并自动调用对象的构造函数或析构函数。

new:申请内存并初始化对象

new 在堆上分配足够空间,然后调用对应类型的构造函数。基本语法是 new 类型new 类型[数量]

  • 分配单个对象:int* p = new int(42); —— 分配一个 int,初始化为 42
  • 分配对象(调用构造函数):string* s = new string("hello");
  • 分配数组:double* arr = new double[10]; —— 分配 10 个 double,不显式初始化(值不确定)
  • 带初始化的数组(C++11 起):int* a = new int[3]{1, 2, 3};

delete:释放内存并清理对象

delete 会先调用对象的析构函数(如果类型有),再把内存还给系统。必须和 new 匹配使用,否则行为未定义。

  • 释放单个对象:delete p; —— 对应 new T
  • 释放数组:delete[] arr; —— 必须用 delete[],对应 new T[N]
  • 释放后建议置空指针:delete p; p = nullptr;,避免重复 delete 或野指针访问

常见错误与注意事项

这些错误不会被编译器报错,但极易引发崩溃、内存泄漏或未定义行为。

  • delete 释放 new[] 分配的内存,或反过来 —— 析构可能不全、内存无法正确回收
  • 重复 delete 同一地址 —— 程序很可能立刻崩溃
  • delete 空指针(nullptr)是安全的,但 delete 野指针(已释放或未初始化)不行
  • new 失败默认抛出 std::bad_alloc 异常;如需检查失败,可用 new(std::nothrow) int 返回 nullptr 而非抛异常

更现代的替代方案(推荐优先使用)

裸 new/delete 容易出错,C++11 后应优先考虑 RAII 智能指针和容器:

  • std::unique_ptr:独占所有权,离开作用域自动 delete
  • std::shared_ptr:共享所有权,引用计数为 0 时自动释放
  • std::vectorstd::string 等:自动管理内部动态内存,无需手动 new/delete

基本上就这些。new/delete 不复杂但容易忽略细节,实际项目中尽量交给智能指针和标准容器来管。