一、为什么需要动态内存?
- 普通数组:长度固定,定义时必须确定大小
- 程序运行时才知道需要多大空间 → 必须用动态内存
- 动态内存从堆区申请,手动申请、手动释放
作用:
- 按需申请内存,不浪费
- 可创建变长数组
- 对象动态创建(后面类与对象会大量用到)
二、new /delete 基本用法
1. 申请单个变量
// 申请 int 类型内存 int *p = new int; // 赋值 *p = 10; cout << *p << endl; // 释放 delete p; // 释放后置空,避免野指针 p = nullptr;2. 申请并初始化
int *p = new int(100); cout << *p; // 100三、动态数组(最常用)
1. 创建动态数组
// 申请存放 5 个 int 的数组 int *arr = new int[5];2. 赋值与访问
arr[0] = 10; arr[1] = 20; cout << arr[0]; // 103. 释放动态数组
⚠️ 数组必须用delete[],不能用delete
delete[] arr; arr = nullptr;四、完整示例:动态创建数组并遍历
#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 必须配对使用,防止内存泄漏