C++学习之避免使用野指针

现有结构体struct_a和struct_b,其中struct_b中包含struct_a指针作为成员变量。先基于struct_a定义一个变量a_ptr,之后定义一个struct_b指针变量b_ptr,并将a_ptr赋值给b_ptr中的struct_a类型变量。之后释放b_ptr, 那么a_ptr指向的内存是否还可以访问?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>struct struct_a{int id;char* name;
};
typedef struct struct_a struct_a_t;struct struct_b{int id;char* name;struct_a_t *struct_a;
};
typedef struct struct_b struct_b_t;int main(){struct_a_t* struct_a = (struct_a_t*)malloc(sizeof(struct_a_t));if (struct_a == NULL) {fprintf(stderr, "Memory allocation failed for struct_a\n");return EXIT_FAILURE;}struct_a->id = 10;struct_a->name = strdup("1000");if (struct_a->name == NULL) {fprintf(stderr, "Memory allocation failed for struct_a->ptr\n");free(struct_a);return EXIT_FAILURE;}struct_b_t* struct_b = (struct_b_t*)malloc(sizeof(struct_b_t));if (struct_b == NULL) {fprintf(stderr, "Memory allocation failed for struct_b\n");free(struct_a->name);free(struct_a);return EXIT_FAILURE;}struct_b->id = 10;struct_b->name = strdup("cadda");if (struct_b->name == NULL) {fprintf(stderr, "Memory allocation failed for struct_b->name\n");free(struct_a->name);free(struct_a);free(struct_b);return EXIT_FAILURE;}struct_b->struct_a = struct_a;printf("address of struct_a: %p\n", struct_a);// 将struct_a的指针保存,以便在释放struct_b后继续使用struct_a_t* saved_struct_a = struct_b->struct_a;// 释放struct_b及其内部的name,但保留对struct_a的引用free(struct_b->name);free(struct_b);struct_b = NULL;// 现在可以安全地使用saved_struct_aprintf("address of saved_struct_a: %p\n", saved_struct_a);// 使用完毕后,释放saved_struct_a及其内部的ptrfree(saved_struct_a->name);free(saved_struct_a);return 0;
}

如果没有使用saved_struct_a来保存struct_a的指针,而是直接释放了struct_b,struct_b的一个成员是指向struct_a的指针。当执行以下代码释放struct_b:

free(struct_b->name);
free(struct_b);
struct_b = NULL;

这确实会释放struct_b所占用的内存,但并不会直接触及到struct_a,因为动态分配的struct_a是独立的。然而,如果没有将struct_a的指针保存到其他地方(比如saved_struct_a),那么一旦struct_b被释放,你就失去了访问struct_a的途径。虽然struct_a的内存没有被直接释放,但它变成了悬空指针——一个仍然存在但没有有效途径访问的内存块。在这种情况下,如果不对struct_a进行额外的保存或管理,它实质上变得不可用,尽管没有立刻造成访问违规,但长期来看容易导致内存泄漏,因为你无法再释放这块内存。

所以,简单来说,不使用saved_struct_a来保存struct_a的指针,在释放struct_b之后,并不会使struct_a立即失效或无法访问(因为它的内存还未被释放),但确实会导致你失去对这块已分配内存的控制,增加内存泄漏的风险,并且在实践中很难安全地再次访问或释放这块内存。因此,保留对所有动态分配内存的有效引用是非常重要的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/845724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红队内网攻防渗透:内网渗透之windows内网权限提升技术:工具篇

红队内网攻防渗透 1. 内网权限提升技术1.1 windows内网权限提升技术--工具篇1.1.1 Web到Win系统提权-平台&语言&用户1.1.1.1 Web搭建平台差异1.1.1.2 Web语言权限差异1.1.1.3 系统用户权限差异1.1.2 Web到Win系统提权-Windows 2012宝塔面板-哥斯拉1.1.2.1 环境条件:1.…

Anthropic公司CEO谈AI发展:Cluade安全超过商业利益

Anthropic公司今年3月发布的超越GPT-4模型Claude3 opus&#xff0c;成功吸引了大量GPT-4用户“叛变”。 作为OpenAI的头号劲敌&#xff0c;Claude3发布方Anthropic公司的联合创始人兼CEO&#xff0c;达里奥阿莫迪&#xff08;DarioAmodei&#xff09;承诺&#xff1a;在能够制…

生信分析进阶4 - 比对结果的FLAG和CIGAR信息含义与BAM文件指定区域提取

BAM文件时存储比对数据的常用格式&#xff0c;可用于短reads和长reads数据。BAM是二进制压缩格式&#xff0c;SAM文件为其纯文本格式&#xff0c;CRAM为BAM的高压缩格式&#xff0c;IO效率相比于BAM略差&#xff0c;但是占用存储空间更小。 1. BAM文件的比对信息 BAM的核心信…

用c语言实现通讯录

目录 静态简易通讯录 代码&#xff1a; 功能模块展示&#xff1a; 设计思路&#xff1a; 动态简易通讯录&#xff08;本质顺序表&#xff09; 代码&#xff1a; 扩容模块展示&#xff1a; 设计思路&#xff1a; 文件版本通讯录 代码&#xff1a; 文件模块展示&#x…

pas编程语言:深度剖析与实用技巧

pas编程语言&#xff1a;深度剖析与实用技巧 在编程的浩瀚海洋中&#xff0c;pas编程语言以其独特的魅力和深厚的内涵吸引着众多编程爱好者。然而&#xff0c;其复杂性和深度也常常让人望而生畏。本文将从四个方面、五个方面、六个方面和七个方面对pas编程语言进行深入剖析&am…

SJ705C安全帽高温预处理箱

一、仪器用途 安全帽高温预处理箱是我公司根据安全帽新国家标准检测试验要求而自主设计研发制造。是安全帽检测前做高温预处理的专用设备。 二、仪器特征 1、有PID自整定温度控制仪&#xff0c;控制准确。 2、数显计时、计温器。 3、石英灯管加热系统;。 …

【数据结构】单链表-->详细讲解,后赋源码

欢迎来到我的Blog&#xff0c;点击关注哦&#x1f495; 前面已经介绍顺序表&#xff0c;顺序表存在一定的局限性&#xff0c;空间管理上存在一定的缺陷&#xff0c;今天介绍新的存储结构单链表。 前言&#xff1a; 单链表是一种基本的数据结构&#xff0c;它由一系列节点组成&a…

HTML网页滚动条使用整理_网页滚动条使用详解

一、HTML 网页滚动条 HTML Document 滚动条,自动出现; 当网页内容超出浏览器可视宽度或者高度,滚动条自动出现; 不同浏览器滚动条样式效果不同。 二、Css 修改滚动条样式 Css 伪元素控制进度条_Css控制滚动条_Css ::-webkit-scrollbar整理 三、Js监听滚动条,触底加载事…

Android 调试桥_ADB命令

Android 调试桥 ADB全称 【Android Debug Bridge】 是Android SDK中的一个命令行工具&#xff0c;adb命令可以直接操作管理Android模拟器或真实的Android设备&#xff08;手机&#xff09; ADB的工作原理 启动一个 adb 客户端时&#xff0c;此客户端首先检查是否有已运行的 …

python zip()函数(将多个可迭代对象的元素配对,创建一个元组的迭代器)zip_longest()

文章目录 Python zip() 函数深入解析基本用法函数原型基础示例 处理不同长度的迭代器高级用法多个迭代器使用 zip() 与 dict()解压序列 注意事项内存效率&#xff1a;zip() 返回的是一个迭代器&#xff0c;这意味着直到迭代发生前&#xff0c;元素不会被消耗。这使得 zip() 特别…

自然语言处理基础知识入门(六) GPT模型详解

GPT 前言一、GPT模型1.1 为什么采用Decoder模块&#xff1f;1.2 为什么不使用Encoder模块&#xff1f; 二、 模型训练2.1 预训练阶段2.2 半监督微调 总结 前言 在之前的章节中&#xff0c;深入探究了预训练ELMo模型的架构与实现原理。通过采用双向LSTM架构在大规模文本数据上进…

[数据集][目标检测][数据集][目标检测]智能手机检测数据集VOC格式5447张

数据集格式&#xff1a;Pascal VOC格式(不包含分割的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;5447 标注数量(xml文件个数)&#xff1a;5447 标注类别数&#xff1a;1 标注类别名称:["phone"] 每个类别标注的框数&#xff…

2024年华为OD机试真题-执行时长-Python-OD统一考试(C卷D卷)

2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述: 为了充分发挥GPU算力,需要尽可能多的将任务交给GPU执行,现在有一个任务数组,数组元素表示在这1秒内新增的任务个数且每秒都有新增任务,假设GPU最多一次执行n个任务,一次执…

Qt程序错误“QObject::connect: Cannot queue arguments of type ‘QTextCursor’”的解决方法

背景&#xff1a; 在Qt的线程中调用QTexiEdit控件的append&#xff08;QString&#xff09;或insertPlainText&#xff08;QString&#xff09;&#xff0c;线程首次执行会报错 “QObject::connect: Cannot queue arguments of type ‘QTextCursor”&#xff0c;销毁该线程&a…

Pytorch中Tensor的类型对应表

Data typedtypeCPU tensorGPU tensor32位浮点数torch.float32 or torch.floattorch.FloatTensortorch.cuda.FloatTensor64位浮点数torch.float64 or torch.doubletorch.DoubleTensortorch.cuda.DoubleTensor16位浮点数torch.float16 or torch.halftorch.HalfTensortorch.cuda.H…

Flutter 中的 SliverWithKeepAliveWidget 小部件:全面指南

Flutter 中的 SliverWithKeepAliveWidget 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它允许开发者使用 Dart 语言构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的丰富组件库中&#xff0c;SliverWithKeepAliveWidget 是一…

宝塔Linux面板-Docker管理(2024详解)

上一篇文章《宝塔Linux可视化运维面板-详细教程2024》,详细介绍了宝塔Linux面板的详细安装和配置方法。本文详细介绍使用Linux面板管理服务器Docker环境。 目录 1、安装Docker 1.1 在线安装 ​编辑 1.2 手动安装 1.3 运行状态 1.4 镜像加速 2 应用商店 3 总览 4 容器 …

高德地图 JS API用于绘画船舶轨迹

文章目录 引言I 2.0升级指南1.1 修改 JSAPI 引用中的版本号到 2.01.2 相应修改II 1.4.15 文档引言 地图 JS API 2.0 是高德开放平台免费提供的第四代 Web 地图渲染引擎, 以 WebGL 为主要绘图手段,本着“更轻、更快、更易用”的服务原则,广泛采用了各种前沿技术,交互体验、…

从CSV到数据库(简易)

需求&#xff1a;客户上传CSV文档&#xff0c;要求CSV文档内容查重/插入/更新相关数据。 框架&#xff1a;jdbcTemplate、commons-io、 DB&#xff1a;oracle 相关依赖&#xff1a; 这里本来打算用的2.11.0&#xff0c;无奈正式项目那边用老版本1.3.1&#xff0c;新版本对类型…

人脸识别系统代码--照片识别

1.导包 Tkinter用于创建GUI&#xff0c;PIL用于图像处理&#xff0c;cv2用于OpenCV库&#xff0c;subprocess用于运行其他Python脚本。 import tkinter as tk from tkinter import filedialog from PIL import Image, ImageTk from PIL.Image import Resampling import cv2 i…