动态内存管理:从基础到实战详解

一、为什么需要动态内存?

  • 普通数组:长度固定,定义时必须确定大小
  • 程序运行时才知道需要多大空间 → 必须用动态内存
  • 动态内存从堆区申请,手动申请、手动释放

作用:

  • 按需申请内存,不浪费
  • 可创建变长数组
  • 对象动态创建(后面类与对象会大量用到)

二、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

七、新手高频易错点(必看)

  1. 动态数组用 delete 释放 (应该用 delete \[\])

    复制代码
    int *arr = new int[5];
    delete arr;   // 错误!会内存泄漏
  2. 内存释放后没有置空,变成野指针

  3. 重复释放同一块内存

  4. 只 new 不 delete → 内存泄漏

  5. 访问越界,导致程序崩溃


八、今日重点总结

  1. 动态内存从堆区 申请,用 new 创建,delete 释放

  2. 单个变量:

    复制代码
    int *p = new int(10);
    delete p;
  3. 动态数组:

    复制代码
    int *arr = new int[n];
    delete[] arr;
  4. 释放后指针必须置空 nullptr

  5. new/delete 必须配对使用,防止内存泄漏

相关推荐
Jack2010 小时前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树12 小时前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2121 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2121 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术1 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦1 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
clint4561 天前
C++进阶(1)——前景提要
c++
用户497863050732 天前
(一)小红的数组操作
算法·编程语言
夜悊2 天前
C++代码示例:进制数简单生成工具
c++