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.mfbz.cn/a/208.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 进程基础(二):操作系统

目录 一、什么是操作系统&#xff1a;用户和电脑之间的「翻译官」&#x1f310; OS 的层状结构&#x1f9e9; 案例解析&#xff1a;双击鼠标的「跨层之旅」 二、操作系统的必要性探究&#xff1a;缺乏操作系统的环境面临的挑战剖析&#x1f511; OS 的「管理者」属性&#xff1…

SpringMVC详解

一&#xff1a;Maven 1.1 概述 &#xff08;1&#xff09;项目结构 所有IDE使用Maven创建的项目结构完全一样&#xff0c;maven项目可通用 &#xff08;2&#xff09;构建流程&#xff08;编译、测试、打包、发布&#xff09; &#xff08;3&#xff09;依赖管理 定义&#xff…

深入解析Linux进程间通信(IPC):机制、应用与最佳实践

引言 在多任务操作系统中&#xff0c;进程间通信&#xff08;Inter-Process Communication, IPC&#xff09;是协同工作的核心机制。Linux作为现代操作系统的典范&#xff0c;提供了8种主要IPC方式&#xff0c;从传统的管道到面向网络的套接字&#xff0c;每种方法都暗藏独特的…

linux 使用nginx部署ssl证书,将http升级为https

前言 本文基于&#xff1a;操作系统 CentOS Stream 8 使用工具&#xff1a;Xshell8、Xftp8 服务器基础环境&#xff1a; nginx - 请查看 linux 使用nginx部署vue、react项目 所需服务器基础环境&#xff0c;请根据提示进行下载、安装。 1.下载证书 以腾讯云为例&#xff…

深入了解Linux系统—— 环境变量

命令行参数 我们知道&#xff0c;我们使用的指令它本质上也是一个程序&#xff0c;我们要执行这个指令&#xff0c;输入指令名然后回车即可执行&#xff1b;但是对于指令带选项&#xff0c;又是如何实现的呢&#xff1f; 问题&#xff1a;main函数有没有参数&#xff1f; 在我…

Oracle OCP认证考试考点详解083系列07

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 31. 第31题&#xff1a; 题目 解析及答案&#xff1a; 从 Oracle 19c 开始&#xff0c;数据库配置助手&#xff08;DBCA&#xff09;在克…

word批量转pdf工具

word批量转pdf工具 图片 说到了办公&#xff0c;怎能不提PDF转换哦&#xff1f; 这是一款一键就可以批量word转换为PDF的小工具&#xff0c;简直是VB界的一股清流。 图片 操作简单到不行&#xff0c;只要把需要转换的word文件和这个工具放在同一个文件夹里&#xff0c;双击…

【网络原理】深入理解HTTPS协议

本篇博客给大家带来的是网络原理的知识点, 由于时间有限, 分三天来写, 本篇为线程第三篇,也是最后一篇. &#x1f40e;文章专栏: JavaEE初阶 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动…

解决Maven项目中报错“java不支持版本6即更高的版本 7”

错误背景 当Maven项目编译或运行时出现错误提示 Java不支持版本6即更高的版本7&#xff0c;通常是由于项目配置的JDK版本与当前环境或编译器设置不一致导致的。例如&#xff1a; 项目配置的Java版本为6或7&#xff0c;但实际使用的是JDK 17。Maven或IDE的编译器未正确指定目标…

Linux用户管理命令和用户组管理命令

一、用户管理命令 1.1、adduser 添加新用户 1、基本语法 adduser 用户名 &#xff08;功能描述&#xff1a;添加新用户&#xff09; 应用场景1&#xff1a;企业开发&#xff0c;多人协同&#xff08;也会有多人使用相同的一个低权限用户&#xff09;。 应用场景2&#x…

网格不迷路:用 CSS 网格生成器打造完美布局

前言 你是否曾因写错 grid-template-areas 而捶键盘?是否在面对千层嵌套的复杂布局时,瞬间怀疑人生,甚至思考要不要转行去卖奶茶?别慌,CSS 网格生成器闪亮登场,像拼乐高一样,帮你轻松搭建网页结构,还能自动输出干净代码,堪称“前端界的乐高大师”。让我们放下枯燥的代…

Java 网络安全新技术:构建面向未来的防御体系

一、Java 安全架构的演进与挑战 1.1 传统安全模型的局限性 Java 平台自 1995 年诞生以来&#xff0c;安全机制经历了从安全管理器&#xff08;Security Manager&#xff09;到 Java 平台模块系统&#xff08;JPMS&#xff09;的演进。早期的安全管理器通过沙箱模型限制不可信…