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

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

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

作用:

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

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

相关推荐
To_OC1 小时前
LC 239 滑动窗口最大值:从暴力超时到单调队列一遍过
javascript·算法·leetcode
.道阻且长.2 小时前
9.LeetCode算法习题讲解--滑动窗口--无重复字符的最长字串
算法·leetcode·职场和发展·哈希算法
余额瞒着我当琳3 小时前
C++--深拷贝三件套 + swap + 写时拷贝 + vector 扩容 + reserve
java·开发语言·c++
ltl3 小时前
HNSW:图索引如何击败树索引
算法
ShineWinsu4 小时前
对于C++:布隆过滤器(bloomfilter)的详细解析
c++·面试·位图·位运算·布隆过滤器·海量数据·比特位
曹牧5 小时前
C#:数字的定义和表示方式
算法·c#
Nil2085 小时前
leetcode 138随机链表的复制
算法·leetcode·链表
疯狂打码的少年7 小时前
【数据结构】图的遍历:深度优先搜索(DFS)
数据结构·笔记·算法·深度优先
-凌凌漆-8 小时前
【freertos】Task创建(v2)
java·开发语言·算法