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 或野指针访问
常见错误与注意事项
这些错误不会被编译器报错,但极易引发崩溃、内存泄漏或未定义行为。
立即学习“C++免费学习笔记(深入)”;
- 用 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::vector
、std::string 等:自动管理内部动态内存,无需手动 new/delete
基本上就这些。new/delete 不复杂但容易忽略细节,实际项目中尽量交给智能指针和标准容器来管。








