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

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

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

作用:

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

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

相关推荐
Severus_black12 分钟前
【C++初阶】list使用及相关实现,思路顺滑流畅!
c语言·数据结构·c++·stl·list
武子康1 小时前
H3-World 为何在加载 LoRA 前,先检查导入的代码?
人工智能·深度学习·算法
秋天的怀念_David2 小时前
算法一千零一夜 · 第二十八夜 注册
java·程序人生·算法
敲上瘾2 小时前
Qt Widgets入门:项目模板解析与Hello World
开发语言·数据库·c++·qt·ui·qt6.3
旖旎夜光3 小时前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
NEFU_Jyj4 小时前
贝尔数(组合数学)
算法
希和20274 小时前
C语言程序设计题|有序数组插入数字冒泡排序
c语言·数据结构·算法
旖旎夜光4 小时前
【C++ 基础入门】C++多态(下):单/多继承虚表、多态补充与 21 道高频题
开发语言·c++·笔记·学习
Pniubi4 小时前
力扣73 矩阵置零
算法·leetcode·矩阵
apcipot_rain15 小时前
C++转Java日记(03)
java·开发语言·c++