当前位置: 首页 > web >正文

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

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


一、什么是二级指针?

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

int** p;

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

常见应用场景

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

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

重点理解两步:

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

图示理解:

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

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

示例代码

#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[] 外层的指针数组
3new[] 必须对应 delete[],不能写成 delete
4内存分配和释放要一一对应,避免内存泄漏
5如果中间分配失败,要释放之前成功分配的部分(异常安全问题)
6C风格的 malloc/free 也可以申请二维数组,但释放方法和 C++ 不一样

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

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; // 释放指针数组

http://www.xdnf.cn/news/3999.html

相关文章:

  • 【KWDB 创作者计划】_Ubuntu 22.04系统KWDB数据库安装部署使用教程
  • Qt中的UIC
  • Amazon Bedrock Converse API:开启对话式AI新体验
  • Qt开发:容器组控件的介绍和使用
  • 20、数据可视化:魔镜报表——React 19 图表集成
  • 408考研逐题详解:2009年第8题
  • Java后端程序员学习前端之CSS
  • Python matplotlib 成功使用SimHei 中文字体
  • 详解RabbitMQ工作模式之发布订阅模式
  • 基于C++实现的深度学习(cnn/svm)分类器Demo
  • Baklib知识中台:智能服务架构新实践
  • 【算法学习】递归、搜索与回溯算法(一)
  • python函数复习(形参实参,收集参数,关键字参数)
  • uniapp中用canvas绘制简单柱形图,小容量,不用插件——简单使用canvas
  • QT 在圆的边界画出圆
  • IP属地是我的定位吗?——解析两者区别
  • Python异步编程入门:从同步到异步的思维转变
  • VBA信息获取与处理专题五:VBA利用CDO发送电子邮件
  • 【外围电路】按键电路设计外接信号输入设计
  • Go小技巧易错点100例(二十九)
  • rollout 是什么:机器学习(强化学习)领域
  • 【Vue】Vue3源码解析与实现原理
  • 关于 dex2oat 以及 vdex、cdex、dex 格式转换
  • VLA算法总结对比——RT1 / RT2 / Pi0 / Octo/ RDT / OpenVLA
  • 钩子函数和参数:Vue组件生命周期中的自定义逻辑
  • 2.3 向量组
  • Linux电源管理(6)_Generic PM之挂起功能
  • Ubuntu K8S(1.28.2) 节点/etc/kubernetes/manifests 不存在
  • n8n工作流自动化平台:生成图文并茂的分析报告之Merge节点详细说明
  • labelimg快捷键