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

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

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

作用:

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

二、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 必须配对使用,防止内存泄漏

相关推荐
MC皮蛋侠客1 天前
Google Test 单元测试指南
c++·单元测试·google test
艾莉丝努力练剑1 天前
【Linux:文件】Ext系列文件系统进阶
linux·运维·服务器·c++·文件系统·文件io·ext
kkeeper~1 天前
0基础C语言积跬步之数据在内存中的存储
c语言·数据结构·算法
wabs6661 天前
关于贪心算法的一些自我总结【力扣45.跳跃游戏II】【灵感来源:代码随想录】
算法·贪心算法·复盘
2401_876964131 天前
【湖北专升本】2026湖北专升本真题PDF+备考资料汇总
数据结构·人工智能·经验分享·深度学习·算法·计算机视觉
basketball6161 天前
C++ NULL 和 nullptr 区别 以及 nullptr 的核心实现
java·开发语言·c++
嗝o゚1 天前
CANN GE 算子融合——融合算法与调度策略
算法·昇腾·cann·ge
小江的记录本1 天前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
Fre丸子_1 天前
自定义文件夹选取功能
c++
Ulyanov1 天前
用声明式语法重新定义Python桌面UI:QML+PySide6现代开发入门(一)
开发语言·python·算法·ui·系统仿真·雷达电子对抗仿真