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

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

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

作用:

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

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

相关推荐
想唱rap2 小时前
C++11之包装器
服务器·开发语言·c++·算法·ubuntu
wuminyu2 小时前
专家视角看Java的线程是如何run起来的过程
java·linux·c语言·jvm·c++
REDcker2 小时前
C++ std::move实现原理与vector扩容移动语义
开发语言·c++·c
im_AMBER2 小时前
Leetcode 158 数组中的第K个最大元素 | 查找和最小的 K 对数字
javascript·数据结构·算法·leetcode·
脱氧核糖核酸__2 小时前
LeetCode热题100——48.旋转图像(题解+答案+要点)
c++·算法·leetcode
木井巳2 小时前
【递归算法】字母大小写全排列
java·算法·leetcode·决策树·深度优先
宵时待雨2 小时前
优选算法专题2:滑动窗口
数据结构·c++·笔记·算法
Mr_pyx2 小时前
LeetCode HOT 100 —— 矩阵置零(多种解法详解)
算法·leetcode·矩阵
葫三生2 小时前
《论三生原理》系列:文化自信、知识范式重构与科技自主创新的思想运动源头?
大数据·人工智能·科技·深度学习·算法·重构·transformer