C++ 中二级指针的正确释放方法

C++ 中二级指针的正确释放


一、什么是二级指针?

简单说,二级指针就是指向指针的指针 。

即:

cpp 复制代码
int** p;

它可以指向一个 int*,而 int* 又指向一个 int 类型的变量。

常见应用场景

  • 动态二维数组(例如 int** matrix)
  • 指针数组(例如 char** argv)
  • 需要动态管理一组指针对象

二、二级指针申请和释放的正确流程

重点理解两步:

  1. 先释放每一级指针分配的内存(通常是内层的一级指针)
  2. 最后释放二级指针本身

图示理解:

复制代码
p --> [p0][p1][p2]...  (指针数组,存在堆区)
       ↓    ↓   ↓
      堆内存 堆内存 堆内存 (每个p[i]指向的内存块)

三、标准示例(动态二维数组申请+释放)

示例代码

cpp 复制代码
#include <iostream>

int main() {
    int rows = 3;
    int cols = 4;

    // 1. 申请二级指针
    int** array = new int*[rows];  // array是指针数组

    // 2. 给每一行分配列的空间
    for (int i = 0; i < rows; ++i) {
        array[i] = new int[cols];
    }

    // 3. 初始化并访问
    for (int i = 0; i < rows; ++i)
        for (int j = 0; j < cols; ++j)
            array[i][j] = i * cols + j;

    // 4. 打印
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j)
            std::cout << array[i][j] << " ";
        std::cout << std::endl;
    }

    // 5. 释放内存:先释放每一行
    for (int i = 0; i < rows; ++i) {
        delete[] array[i];  // 释放列
    }

    // 6. 最后释放指针数组本身
    delete[] array;

    return 0;
}

四、注意事项总结(重点)

注意点 说明
1 必须先释放内层的 new[] 分配的每个块
2 最后再 delete[] 外层的指针数组
3 new[] 必须对应 delete[],不能写成 delete
4 内存分配和释放要一一对应,避免内存泄漏
5 如果中间分配失败,要释放之前成功分配的部分(异常安全问题)
6 C风格的 malloc/free 也可以申请二维数组,但释放方法和 C++ 不一样

五、错误示范(不要这么做 )

cpp 复制代码
int** p = new int*[10];
for (int i = 0; i < 10; ++i)
    p[i] = new int[20];

// 错误释放!!!
delete[] p[0];  // ❌ 只释放了第一行,其他内存泄漏
delete[] p;     // ❌ 外层释放没问题,但里面没释放干净

小结:二级指针内存管理口诀

"内层先释放,外层后释放;new\[\]就用delete\[\]"

完整释放流程:

  • delete[] p[i]; // 释放每一行
  • delete[] p; // 释放指针数组

相关推荐
2601_96574222几秒前
短视频脚本创作方法分享:本地生活类账号的起步思路
大数据·人工智能·算法·ai·新媒体运营·生活
caoerzhong几秒前
跨境海外仓怎么管:JeeWMS 开源 Java 仓库管理系统打通头程、海外仓与尾程
java·开发语言·开源
xhy_07075 分钟前
Git 合并冲突怎么解决?用 AI 处理冲突的流程、Prompt 和 4 个易错点
人工智能·git·安全·prompt·ai编程·代码复审
码云数智-大飞6 分钟前
新手写 Python 代码,如何规范命名、减少 Bug
开发语言·python·php
马剑威(威哥爱编程)8 分钟前
【AI全栈后端12-02】Spring Boot 跑通第一个 AI 对话接口:HR 政策问答机器人实战
java·人工智能·spring boot·机器人
果霸大叔8 分钟前
RAG 数据导入与解析全攻略(二):图文与 PDF 解析——OCR、多模态大模型与九种 PDF 工具选型
人工智能
55873生态系统手记8 分钟前
读完 55873 资产钱包的技术栈,我重新理解了 "合规钱包" 应该长什么样
算法·架构
IT枫斗者枫哥10 分钟前
AI返回合法JSON,字段就可信吗?给抽取结果补一道业务校验
java·人工智能·后端
旋生万物11 分钟前
素数螺旋映射 $z_n=n^{1+i}$ 的角分布统计检验与零模型对比
大数据·前端·人工智能·算法·云原生·螺旋生成论·螺旋相位
HRTOS14 分钟前
HRTOS Shell继续完善:优化printf缓冲区与字符串越界保护,国庆后随新版本更新
运维·单片机·嵌入式硬件·算法·51单片机