C++ new 和 delete
new 关键字
new 关键字允许您自己管理内存。
在下面的例子中,我们使用 new 为一个整数创建内存空间,将值 35 存储在其中,并使用指针打印它:
实例
int* ptr = new int; *ptr = 35; cout << *ptr;
解释:
new int为一个整数创建内存空间ptr存储该空间的地址*ptr = 35;存储数字 35cout << *ptr;打印该值
所以我们使用 new 来创建内存,并使用 ptr 来访问它。
delete 关键字
当您用 new 创建某些东西时,您有责任在完成后将其移除。
为此,请使用 delete:
实例
delete ptr;
这告诉 C++:"我用完这块内存了,你现在可以清理它了。"
如果您忘记 delete 会发生什么?
如果您忘记 delete 内存,您的程序仍然会运行,但随着时间的推移,它可能会使用越来越多的内存。
这被称为内存泄漏,并且可能随着时间的推移导致程序变慢或崩溃。
将 new 和 delete 与数组一起使用
您也可以使用 new 关键字来创建动态数组。
注意:对于数组,请使用 new[] 和 delete[]。对于单个变量,请使用 new 和 delete。
当您事先不知道数组的大小时——比如大小取决于用户输入或程序开始时未知的其他值——动态数组非常有用。
例如,假设您经营一家酒店。由于您不知道会有多少客人到达,您向用户询问数量,并创建那么多房间——每个房间存储一位客人的姓名:
实例
#include <iostream>
#include <string>
using namespace std;
int main() {
int numGuests;
cout << "有多少位客人? ";
cin >> numGuests;
// 检查无效输入
if (numGuests <= 0) {
cout << "客人数量必须至少为 1。\n";
return 0;
}
// 为 x 位客人创建内存空间(一个字符串数组)
string* guests = new string[numGuests];
// 忽略读取 numGuests 后留下的换行符
cin.ignore();
// 输入客人姓名
for (int i = 0; i < numGuests; i++) {
cout << "输入客人 " << (i + 1) << " 的姓名:";
getline(cin, guests[i]); // 读取全名(包括空格)
}
// 显示所有客人
cout << "\n已登记的客人:\n";
for (int i = 0; i < numGuests; i++) {
cout << guests[i] << "\n";
}
delete[] guests; // 清理内存
return 0;
}
示例结果:
有多少位客人? 3 输入客人 1 的姓名:John Doe 输入客人 2 的姓名:Liam Spurs 输入客人 3 的姓名:Jenny Kasp 已登记的客人: John Doe Liam Spurs Jenny Kasp
何时使用 new
在大多数情况下,您不需要使用 new。C++ 会自动为普通变量处理内存,例如:
int age = 35; string name = "John";
但有时,您必须自己管理内存——特别是当:
- 您事先不知道需要多少内存(例如,多少位客人或多少个分数)
- 您希望在程序运行时,根据用户输入创建内存
- 您需要存储大量或灵活数量的数据
- 您想要完全手动控制内存(例如,性能关键的代码)
在这些情况下,new 帮助您创建内存,delete 帮助您在完成后清理它。
提示:如果您使用 new,请始终记得使用 delete(或对数组使用 delete[])以避免内存泄漏。