C++中的new和delete是专门用于动态内存管理的操作符,它们负责在堆上分配和释放内存,是处理不确定大小的对象、延长对象生命周期的核心手段,和C语言的malloc、free有本质区别。

new和delete的基本用法
new操作符用于在堆上分配内存并调用对象的构造函数,delete操作符用于调用对象的析构函数并释放对应的堆内存,两者必须成对出现且严格匹配。
基本类型的内存管理
对于基本数据类型,new分配内存后会返回对应类型的指针,delete直接释放即可:
#include <iostream>
using namespace std;
int main() {
// 分配单个int类型内存,初始化为10
int* pInt = new int(10);
cout << *pInt << endl; // 输出10
delete pInt; // 释放内存,pInt变为悬空指针
pInt = nullptr; // 建议置空避免野指针
// 分配int数组,长度为5
int* pArr = new int[5]{1,2,3,4,5};
for (int i = 0; i < 5; i++) {
cout << pArr[i] << " ";
}
cout << endl;
delete[] pArr; // 释放数组必须用delete[]
pArr = nullptr;
return 0;
}
自定义类型的内存管理
对于自定义类类型,new会先分配内存再调用构造函数,delete会先调用析构函数再释放内存:
#include <iostream>
#include <cstring>
using namespace std;
class Student {
public:
char* name;
int age;
Student(const char* n, int a) {
name = new char[strlen(n) + 1];
strcpy(name, n);
age = a;
cout << "Student构造,name=" << name << endl;
}
~Student() {
delete[] name; // 释放内部堆内存
cout << "Student析构" << endl;
}
};
int main() {
// new调用Student构造函数
Student* stu = new Student("张三", 18);
cout << "姓名:" << stu->name << ",年龄:" << stu->age << endl;
delete stu; // 先调用~Student,再释放stu指向的内存
return 0;
}
new和delete的使用规则
严格匹配原则
new和delete的匹配规则必须遵守,否则会导致未定义行为:
- 用
new分配的单个对象,必须用delete释放 - 用
new[]分配的数组,必须用delete[]释放 - 不允许用
delete释放new[]分配的内存,也不允许用delete[]释放new分配的内存 - 不允许重复释放同一块内存,也不允许释放栈上的内存或非动态分配的内存
置空悬空指针
delete释放内存后,指针本身不会自动置空,会变成悬空指针,后续如果误用该指针会导致程序崩溃,因此建议在delete后将指针赋值为nullptr。
常见使用误区
内存泄漏
忘记调用delete释放动态分配的内存,就会导致内存泄漏,程序运行时间越长占用的内存越多,最终可能耗尽内存:
// 错误示例:内存泄漏
void func() {
int* p = new int(100);
// 没有delete p,函数结束后p被销毁,堆上的100无法被释放
}
重复释放
对同一块内存调用多次delete,会导致程序崩溃:
// 错误示例:重复释放
int main() {
int* p = new int(10);
delete p;
delete p; // 重复释放,未定义行为
return 0;
}
数组释放错误
用new[]分配的数组用delete释放,只会调用第一个元素的析构函数,并且释放内存的方式不正确:
// 错误示例:数组释放方式错误
int main() {
int* arr = new int[10];
delete arr; // 错误,应该用delete[]
return 0;
}
new/delete与malloc/free的区别
两者都是动态内存管理工具,但存在本质差异:
| 对比项 | new/delete | malloc/free |
|---|---|---|
| 属性 | C++操作符 | C库函数 |
| 构造函数/析构函数 | 会调用 | 不会调用 |
| 返回类型 | 对应类型的指针 | void*,需要强制转换 |
| 分配失败处理 | 抛出std::bad_alloc异常 | 返回NULL |
| 内存分配大小 | 自动计算类型大小 | 需要手动指定字节数 |
最佳实践建议
- 尽量避免手动使用new和delete,优先使用智能指针(如unique_ptr、shared_ptr)或者标准容器(如vector、string),让内存管理自动化
- 如果必须手动使用new和delete,遵循谁分配谁释放的原则,明确内存的归属方
- 在delete之后立即将指针置为nullptr,避免悬空指针问题
- 对于数组的动态分配,优先使用vector代替new[],减少数组释放错误的风险
newdeleteC++_memory_management内存泄漏修改时间:2026-07-01 08:39:35