在C++中,new
操作符用于在堆上动态分配内存,它比静态或栈内存分配更灵活。使用 new
分配的内存需要用 delete
来释放,以防止内存泄漏。以下是 new
的常见使用方法:
1. 基本用法:分配单个变量
int* p = new int; // 动态分配一个整型变量
*p = 5; // 赋值
delete p; // 释放内存
上面代码中,new int
在堆上分配了一个 int
变量,并返回该变量的指针。用完后,使用 delete p
来释放内存。
2. 分配并初始化变量
int* p = new int(10); // 分配一个 int,并初始化为 10
double* d = new double(3.14); // 分配一个 double,并初始化为 3.14
delete p;
delete d;
使用括号可以在分配内存的同时初始化变量。
3. 分配数组
int* arr = new int[5]; // 分配一个包含5个int元素的数组
for (int i = 0; i < 5; i++) {arr[i] = i * 2; // 初始化数组
}
delete[] arr; // 用delete[]释放数组内存
当分配数组时,必须用 delete[]
来释放数组的内存,否则会导致内存泄漏。
4. 分配自定义对象
class Student {
public:Student() { }void display() { cout << "Hello, Student!" << endl; }
};Student* s = new Student; // 分配一个 Student 对象
s->display();
delete s; // 释放内存
此代码中使用 new
为类的对象分配内存,释放时使用 delete
。
5. 分配对象数组
Student* students = new Student[3]; // 分配一个包含3个Student对象的数组
delete[] students; // 释放数组
6. 使用new
分配二维数组
二维数组可以通过循环分配多个一维数组实现:
int** matrix = new int*[3]; // 分配一个指针数组
for (int i = 0; i < 3; i++) {matrix[i] = new int[4]; // 为每个指针分配一个包含4个int的数组
}// 释放二维数组内存
for (int i = 0; i < 3; i++) {delete[] matrix[i]; // 释放每一行
}
delete[] matrix; // 释放指针数组
7. new
的异常处理
new
在分配失败时会抛出 std::bad_alloc
异常,可以使用异常处理机制捕获错误:
try {int* p = new int[1000000000]; // 尝试分配大量内存
} catch (const std::bad_alloc& e) {cout << "Memory allocation failed: " << e.what() << endl;
}
总结
new
分配单个变量或对象时使用delete
释放;new
分配数组时使用delete[]
释放;- 异常处理可以确保内存分配失败时程序的健壮性。
注意
不释放动态分配的内存会导致内存泄漏,这会增加程序的内存占用、影响性能、增加调试难度,甚至最终导致程序崩溃。为避免内存泄漏,建议:
- 使用 delete 或 delete[] 释放内存;
- 考虑使用智能指针来自动管理内存;
- 使用内存检测工具来帮助查找问题。