一、为什么需要动态内存?
- 普通数组:长度固定,定义时必须确定大小
- 程序运行时才知道需要多大空间 → 必须用动态内存
- 动态内存从堆区申请,手动申请、手动释放
作用:
- 按需申请内存,不浪费
- 可创建变长数组
- 对象动态创建(后面类与对象会大量用到)
二、new /delete 基本用法
1. 申请单个变量
cpp
// 申请 int 类型内存
int *p = new int;
// 赋值
*p = 10;
cout << *p << endl;
// 释放
delete p;
// 释放后置空,避免野指针
p = nullptr;
2. 申请并初始化
cpp
int *p = new int(100);
cout << *p; // 100
三、动态数组(最常用)
1. 创建动态数组
cpp
// 申请存放 5 个 int 的数组
int *arr = new int[5];
2. 赋值与访问
cpp
arr[0] = 10;
arr[1] = 20;
cout << arr[0]; // 10
3. 释放动态数组
⚠️ 数组必须用 delete[],不能用 delete
cpp
delete[] arr;
arr = nullptr;
四、完整示例:动态创建数组并遍历
cpp
#include <iostream>
using namespace std;
int main() {
int n;
cout << "请输入数组长度:";
cin >> n;
// 动态申请数组
int *arr = new int[n];
// 赋值
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
// 遍历输出
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
// 释放数组
delete[] arr;
arr = nullptr;
system("pause");
return 0;
}
五、内存区域简单区分
表格
| 区域 | 存放内容 | 分配释放 |
|---|---|---|
| 栈区 | 局部变量、数组 | 自动分配、自动释放 |
| 堆区 | new 出来的内存 | 手动 new /delete |
- 栈区:自动管理,不用操心
- 堆区:必须自己释放,否则内存泄漏
六、malloc /free 与 new /delete 区别(简单了解)
malloc / free:C 语言函数,只分配内存,不调用构造 / 析构函数new / delete:C++ 关键字,分配内存 + 初始化,会调用构造 / 析构- 写 C++ 优先用:new / delete
七、新手高频易错点(必看)
-
动态数组用 delete 释放 (应该用 delete [])
int *arr = new int[5]; delete arr; // 错误!会内存泄漏 -
内存释放后没有置空,变成野指针
-
重复释放同一块内存
-
只 new 不 delete → 内存泄漏
-
访问越界,导致程序崩溃
八、今日重点总结
-
动态内存从堆区 申请,用
new创建,delete释放 -
单个变量:
int *p = new int(10); delete p; -
动态数组:
int *arr = new int[n]; delete[] arr; -
释放后指针必须置空 nullptr
-
new/delete 必须配对使用,防止内存泄漏