C++ new 和 delete

new 关键字

new 关键字允许您自己管理内存。

在下面的例子中,我们使用 new 为一个整数创建内存空间,将值 35 存储在其中,并使用指针打印它:

实例

int* ptr = new int;
*ptr = 35;
cout << *ptr;

亲自试一试

解释:

  • new int 为一个整数创建内存空间
  • ptr 存储该空间的地址
  • *ptr = 35; 存储数字 35
  • cout << *ptr; 打印该值

所以我们使用 new 来创建内存,并使用 ptr 来访问它。

delete 关键字

当您用 new 创建某些东西时,您有责任在完成后将其移除。

为此,请使用 delete

实例

delete ptr;

亲自试一试

这告诉 C++:"我用完这块内存了,你现在可以清理它了。"

如果您忘记 delete 会发生什么?

如果您忘记 delete 内存,您的程序仍然会运行,但随着时间的推移,它可能会使用越来越多的内存。

这被称为内存泄漏,并且可能随着时间的推移导致程序变慢或崩溃。

将 new 和 delete 与数组一起使用

您也可以使用 new 关键字来创建动态数组。

注意:对于数组,请使用 new[]delete[]。对于单个变量,请使用 newdelete

当您事先不知道数组的大小时——比如大小取决于用户输入或程序开始时未知的其他值——动态数组非常有用。

例如,假设您经营一家酒店。由于您不知道会有多少客人到达,您向用户询问数量,并创建那么多房间——每个房间存储一位客人的姓名:

实例

#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[])以避免内存泄漏。