📘new/delete 动态内存

2026-08-15
⭐⭐ GESP 6级

📖概念讲解

【考点 · 6级】 new/delete 是 C++ 动态内存管理运算符,属于「指针与内存」类考点。

【说人话】 栈上的变量编译期就定好了大小,而 new 能在堆(heap)上按需分配内存,返回一个指向该内存的指针。用完必须用 delete 释放,否则内存泄漏。数组要用 new[] 和 delete[] 配对,否则行为未定义。

💡 核心规则:
• new int → 分配 1 个 int,返回 int*
• new int[10] → 分配 10 个 int 的数组,返回 int*
• delete p → 释放单个对象
• delete[] p → 释放数组
• delete 后指针变野指针,应立即置 nullptr

💻代码示例

1#include <iostream>
2using namespace std;
3
4int main() {
5 int* p = new int(42); // 在堆上分配1个int,初始值42
6 cout << *p << endl; // 输出:42
7 delete p; // 释放内存!不释放=内存泄漏
8 p = nullptr; // 防止野指针,好习惯
9
10 int* arr = new int[5]; // 在堆上分配5个int的数组
11 for (int i = 0; i < 5; i++)
12 arr[i] = i * 10; // 用法和普通数组完全一样
13 for (int i = 0; i < 5; i++)
14 cout << arr[i] << " ";
15 cout << endl; // 输出:0 10 20 30 40
16 delete[] arr; // ⚠️ 数组必须用 delete[]!
17 arr = nullptr; // 释放后置空
18
19 return 0;
20}

# 输出:42 → 0 10 20 30 40

🧩互动小测

❓ 下面哪行代码有问题?

❓ new 在哪里分配内存?

❓ delete 一个指针后,该指针的值是?

🏋️动手练一练

📝 编程练习

题目:用 new 在堆上动态创建一个大小为 n 的 int 数组(n 由用户输入),然后输入 n 个整数存入数组,计算并输出它们的平均值。最后释放内存。

要求:
• 使用 new[] 分配内存
• 计算平均值保留 2 位小数
• 释放内存后输出 "Memory freed"

提示:用 static_cast<double> 做浮点除法。
参考答案:
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    int n;
    cin >> n;                          // 读取数组大小
    int* arr = new int[n];              // 堆上分配 n 个 int
    double sum = 0;
    for (int i = 0; i < n; i++) {
        cin >> arr[i];                 // 读入每个元素
        sum += arr[i];                  // 累加求和
    }
    cout << fixed << setprecision(2);
    cout << "平均值: " << sum / n << endl;
    delete[] arr;                       // 释放数组内存
    arr = nullptr;
    cout << "Memory freed" << endl;
    return 0;
}

要点:new[] 必须配对 delete[],不能用 delete。释放后置 nullptr 是好习惯。

📝易错点提醒

学完这个知识点后点一下