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

智能指针之设计模式1

本文探讨一下智能指针和GOF设计模式的关系,如果按照设计模式的背后思想来分析,可以发现围绕智能指针的设计和实现有设计模式的一些思想体现。当然,它们也不是严格意义上面向对象的设计模式,毕竟它们没有那么分明的类层次体系,和GOF经典设计模式在外在形式上有所差别,重点是理解设计模式的思想在它们身上的体现,以及怎样帮助它们实现意图的。

限于篇幅,分成了几篇文章来介绍,先从对象的创建开始。

1、工厂模式

工厂模式是把创建对象和使用对象的职责分离了,它们可以控制对象的创建过程,封装了创建细节,让用户不再关心具体对象的创建过程。

C++标准库提供了一些辅助函数和辅助类来创建智能指针对象,它们都是工厂方法或者工厂类。创建unique_ptr和shared_ptr除了使用常规的构造函数之外,还提供了三个工厂方法:make_shared()、make_unique()和allocate_shared(),它们都是简单工厂方法;此外,为了能够从一个shared_ptr对象的内部,通过this指针创建一个shared_ptr对象,工厂类enable_shared_from_this<T>还提供了成员函数shared_from_this()作为工厂方法。

那么,使用工厂模式创建智能指针对象有什么好处呢?

首先,通过工厂方法可以给创建过程起一个富有表达力、自解释的名称,能有效地帮助程序员容易使用,甚至无需提供阅读文档接口,而类的构造函数必须和类名完全一样,无法能够见文知意。make_shared()和make_unique(),一看就知道是创建shared_ptr和unique_ptr对象,更具特色的是shared_from_this(),通过它的名称就应该知道这个函数是通过this指针来创建shared_ptr对象,既然有this字眼,也能知道应该是在一个类的内部使用。

其次,关注点分离,分离了创建智能指针和使用智能指针的职责,让程序员不再关心智能指针对象的创建过程,不再关心是如何创建出来的,程序员把关注点放在智能指针的使用上面,减轻了程序员的心智负担。有人说,C++有了智能指针之后,就不应该在程序中出现new和delete了,可能说的绝对了点,但显然工厂方法make_shared()和make_unique()给了他这样说的底气。

再者,工厂模式可以控制智能指针对象的创建过程,这也是核心意图,它的作用有下面几点:

1、保证在堆中创建资源对象
智能指针缺省要求管理的资源对象是在堆中创建的对象,如果把一个指向栈上创建的对象的指针,让unique_ptr或shared_ptr去管理,最后在析构时会发生异常,显然是不对的。如何避免程序员无意中犯这样错误?那么作为控制对象创建过程的工厂模式,用在这儿再合适不过了。由工厂方法来控制智能指针对象的创建过程,程序员在make_unique和make_shared工厂函数中只传递创建资源对象相关参数就行了,即保证智能指针管理的肯定是使用new操作符创建的对象,这样就保证了程序的安全性。

2、保证创建过程中资源对象不泄露
make_unique()和make_shared()能够保证资源对象的释放安全,我们稍加留意就会发现,无论是shared_ptr类还是unique_ptr类,在它们的构造函数中都没有同时初始化对象资源,对象资源是在外部使用new操作符在堆上创建之后,以裸指针的形式作为构造函数的参数来创建智能指针对象,也就是说资源对象的创建和智能指针对象的创建,它们不是一体的,它们之间是有空隙的,如果在这个间隙中有别的代码运行,并发生了异常,可能会造成资源泄漏。比如(这个例子来自Effective Modern C++ 条款21):

processWidget(std::shared_ptr<Widget>(new Widget), computePriority());

因为编译器在编译时,可能是按照下面的顺序生成代码:1、实施“new Widget”,2、执行computePriority(),3、运行std::shared_ptr构造函数。如果生成了这样的代码,并且在运行时computePriority()发生了异常,那么在第1步动态分配的Widget对象会被泄露,因为它没有机会被存储到第3步才接管它的shared_ptr对象中去。如果使用make_shared()工厂方法来创建shared_ptr对象,就不会有潜在的资源泄露风险了:

processWidget(make_shared<Widget>(), computePriority());

使用make_unique和make_shared让unique_ptr和shared_ptr在创建对象时就同时获取了资源,即获取资源即初始化(符合了RAII惯例的字面意思)。

3、创建时优化内存空间布局
工厂方法make_shared()在创建shared_ptr对象时,还可以对内存布局进行优化。shared_ptr对象包含了两个指针成员,一个指向资源对象,一个指向控制块,需要进行两次new操作才能初始化完,在访问时需要分别进行两次指针解引用。如果资源对象和控制块分配在同一个内存块中,这样就有更好的空间局部性,对cache更友好。在make_shared()内部可以进行控制这个实现过程,把控制块的大小与资源的大小的和作为分配内存空间的大小,new一次就行了,然后分别让资源对象指针和控制块指针分别指向它们所在的位置,并初始化。让内存空间更紧凑,节省了内存空间,同时因为有更好的cache局部性,也提高了访问速度。

4、保证安全创建智能指针对象
weak_ptr类的lock()成员函数也是创建shared_ptr对象的一个工厂方法,控制的是从一个还没有销毁资源对象的shared_ptr对象中创建另一个shared_ptr对象。在多线程环境下,增加shared_ptr对象的引用计数和把控制块指针、资源对象指针作为参数创建shared_ptr对象时,它们不是原子操作,在多线程下会存在data race。因此,在创建时需要保证线程安全,显然交给程序员在外面实现是不现实的,那就把它封装在一个工厂方法中,让它来控制shared_ptr的创建过程,保证创建过程的线程安全。

enable_shared_from_this<T>类的成员函数shared_from_this()也是创建shared_ptr对象的一个工厂方法,控制的是通过资源对象的this指针来创建shared_ptr对象。它保证了是从一个已有的shared_ptr对象中创建的,如果不是,则会抛出异常;同时也保证了不会发生同一个this指针被多个不同shared_ptr对象管理生存期的错误,否则,如果用户在外部随便把this指针作为参数去调用shared_ptr构造函数,可能是重复管理,而发生错误。

最后,智能指针是裸指针的包装类,而裸指针又指向资源对象,控制创建智能指针对象的过程,实际上也是在控制创建资源对象的过程。例如,工厂模式在控制智能指针对象的创建过程同时,也控制了资源对象使用new在堆上创建,如make_unique()和make_shared(),也控制了shared_ptr对象从this指针创建的过程,如shared_from_this()。

工厂模式控制了智能指针和资源对象的创建过程,那么销毁工作又是如何实现的呢?下一篇文章继续介绍。

相关文章:

智能指针之设计模式1

本文探讨一下智能指针和GOF设计模式的关系&#xff0c;如果按照设计模式的背后思想来分析&#xff0c;可以发现围绕智能指针的设计和实现有设计模式的一些思想体现。当然&#xff0c;它们也不是严格意义上面向对象的设计模式&#xff0c;毕竟它们没有那么分明的类层次体系&…...

Spring Boot 中应用的设计模式

Spring Boot 中应用的设计模式详解 Spring Boot 作为 Spring 框架的扩展&#xff0c;广泛使用了多种经典设计模式。以下是主要设计模式及其在 Spring Boot 中的具体应用&#xff1a; 一、创建型模式 1. 工厂模式 (Factory Pattern) 应用场景&#xff1a; BeanFactory 和 Ap…...

23种GoF设计模式

GoF&#xff08;Gang of Four&#xff09;设计模式是由四位计算机科学家 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著的书籍《Design Patterns: Elements of Reusable Object-Oriented Software》中提出的设计模式 目录 一、创建型模式&#xff08;Cre…...

Python实例题:Python实现中文错别字高亮系统

目录 Python实例题 题目 安装依赖库 代码实现 代码解释 运行思路 注意事项 Python实例题 题目 Python实现中文错别字高亮系统 安装依赖库 在开始之前&#xff0c;你需要安装 pycorrector 和 rich 库。可以使用以下命令进行安装&#xff1a; pip install pycorrecto…...

【第三十一周】ViT 论文阅读笔记

ViT 摘要Abstract文章信息引言方法Patch EmbeddingPatch Position EmbeddingTransformer EncoderMLP Head整体架构CNN的归纳偏置 代码实现实验结果总结 摘要 本篇博客介绍了Vision Transformer&#xff08;ViT&#xff09;&#xff0c;这是一种突破性的图像分类模型&#xff…...

射频(RF)静电放电防护方案

方案简介 射频&#xff08;RF&#xff09;是 Radio Frequency 的缩写&#xff0c;表示可以辐射到空间的电磁频率&#xff0c;频率 范围从 300kHz&#xff5e;300GHz 之间。射频就是射频电流&#xff0c;简称 RF&#xff0c;它是一种高频交流变化 电磁波的简称。射频天线是一…...

【redis进阶三】分布式系统之主从复制结构(1)

目录 一 为什么要有分布式系统&#xff1f; 二 分布式系统涉及到的非常关键的问题&#xff1a;单点问题 三 学习部署主从结构的redis (1)创建一个目录 (2)进入目录拷贝两份原有redis (3)使用vim修改几个选项 (4)启动两个从节点服务器 (5)建立复制&#xff0c;要想配…...

排序(1)

排序&#xff08;1&#xff09; 日常生活中&#xff0c;有很多场景都会用到排序。比如你买东西&#xff0c;在购物软件就有几种展现方式&#xff0c;按照评论数量给你排序出来&#xff0c;让你选&#xff0c;还是说按照价钱高低排序出来让你选。 排序其实是一种为了更好解决问…...

NR 5G中的N5接口

N5接口的定义: Reference point between the PCF and an AF or TSN AF. 即N5 PCF和AF之间的参考点。 AF Application Function 应用功能&#xff0c;指应用层的各种服务&#xff0c;可以是运营商内部的应用如Volte AF(类似4G的Volte As&#xff09;、也可以是第三方的AF&…...

STM32自学进阶指南:从入门到精通的成长路径 | 零基础入门STM32第九十九步

主题内容教学目的/扩展视频自学指导通过数据手册和搜索引擎查找资料,独立解决问题以积累经验和提升能力。自学过程中应保持敬畏之心,不断总结未知领域,持续进步。师从洋桃电子,杜洋老师 📑文章目录 一、自学指导全景图1.1 学习路线对比1.2 关键学习策略二、待探索技术领域…...

利用 Python 进行股票数据可视化分析

在金融市场中&#xff0c;股票数据的可视化分析对于投资者和分析师来说至关重要。通过可视化&#xff0c;我们可以更直观地观察股票价格的走势、交易量的变化以及不同股票之间的相关性等。 Python 作为一种功能强大的编程语言&#xff0c;拥有丰富的数据处理和可视化库&#xf…...

用 Vue.js 构建基础购物车:从 0 到 1 的实战解析

在当今数字化购物的浪潮中&#xff0c;购物车功能已成为电商平台不可或缺的一部分。它不仅承担着记录用户所选商品的重任&#xff0c;还需提供流畅的交互体验和精准的计算逻辑。本文将深入探讨如何利用 Vue.js 这一强大的 JavaScript 框架&#xff0c;逐步搭建一个基础但功能完…...

MapSet常用的集合类(二叉搜索树,哈希表)

Set集合 Set的核心特点&#xff1a; Set继承了Collection。 保存的元素不会重复。 保存的元素不能修改。 保存的元素无序&#xff0c;和List不同&#xff0c;如果有两个&#xff1a;List {1&#xff0c;2&#xff0c;3}&#xff0c;List {2&#xff0c;1&#xff0c;3}&…...

五种IO模型

1、通信的本质&#xff1a; 通过网络通信的学习&#xff0c;我们能够理解网络通信的本质是进程间通信&#xff0c;而进程间通信的本质就是IO。 IO也就是input和output。当读取条件不满足的时候&#xff0c;recv会阻塞。write写入数据时&#xff0c;会将数据拷贝到缓冲区中&am…...

路由器开启QOS和UPNP的作用

QOS 的作用 保障关键业务带宽&#xff1a;可根据网络应用的重要性分配带宽。比如在家庭网络中&#xff0c;当多人同时使用网络时&#xff0c;将视频会议等实时性要求高的关键业务设置为高优先级&#xff0c;确保其能获得足够带宽&#xff0c;避免卡顿&#xff0c;而文件下载等…...

学习MySQL的第九天

纸上得来终觉浅 绝知此事要躬行 数据处理的增删查改 一、添加数据 添加数据有两种方式&#xff0c;一种是一条一条的添加数据&#xff0c;另一种是通过对其他表的查询&#xff0c;将查询的结果插入到表中&#xff1b;第一种方式又可以分为三种方式&#xff1a…...

怎么免费下载GLTF/GLB格式模型文件,还可以在线编辑修改

​ 现在非常流行glb格式模型&#xff0c;和gltf格式文件&#xff0c;可是之类模型网站非常非常少 1&#xff0c;咱们先直接打开http://glbxz.com 官方glb下载网站 glbxz.com 2 可以搜索&#xff0c;自己想要的模型关键词 3&#xff0c;到自己想下载素材页面 4&#xff0c;…...

高效数据拷贝方法总结

1.系统/语言层面的高效拷贝 内存拷贝优化 使用memcpy(C/C)或类似函数进行大块内存拷贝 利用SIMD指令(如AVX/SSE)进行向量化拷贝 2.零拷贝技术 文件映射(mmap) - 将文件映射到内存空间 发送文件描述符而非数据本身(Unix域套接字) 使用sendfile系统调用(文件到套接字直接传…...

C 语言 第八章 文件操作

目录 文件操作 文件和流的介绍 C 输入 & 输出 C 文件的读写 创建/打开文件 写入文件 fputc 函数 fputs 函数 fprintf 函数 实例&#xff1a; 读取文件 fgets函数 实例&#xff1a; 关闭文件 文件操作 文件和流的介绍 变量、数组、结构体等数据在运行时存储于内存…...

开发一款游戏需要哪些岗位角色参与?

常见分类 1. 游戏策划&#xff08;Game Designer&#xff09; 核心职责&#xff1a;设计游戏的玩法、规则、内容和整体体验。 具体工作&#xff1a; 系统设计&#xff1a;设计游戏的战斗、经济、成长、社交等核心系统。 数值设计&#xff1a;平衡角色属性、装备数值、经济系…...

大模型面经 | 手撕多头注意力机制(Multi-Head Attention)

大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...

二叉树的初步学习

前言 对于二叉树的学习不想其他数据结构一样&#xff0c;直接学习他的结构的构建。单纯的一个二叉树在实际中没什么作用&#xff0c;除非是加了限制条件的&#xff0c;比如大名鼎鼎的红黑树。但是对于初学者而言&#xff0c;刚开始就学习红黑树&#xff0c;会让你刚接触就想放…...

Tkinter菜单和工具栏的设计

在这一章中,我们将深入探讨如何在Tkinter应用程序中设计菜单和工具栏。菜单和工具栏是桌面应用程序中常见的界面元素,它们为用户提供了便捷的操作方式。通过这一章的学习,您将能够在您的Tkinter应用中添加菜单栏和工具栏,提升用户体验。 6.1 菜单栏的设计 菜单栏是应用程…...

windows中搭建Ubuntu子系统

windows中搭建虚拟环境 1.配置2.windows中搭建Ubuntu子系统2.1windows配置2.1.1 确认启用私有化2.1.2 将wsl2设置为默认版本2.1.3 确认开启相关配置2.1.4重启windows以加载更改配置 2.2 搭建Ubuntu子系统2.2.1 下载Ubuntu2.2.2 迁移位置 3.Ubuntu子系统搭建docker环境3.1安装do…...

Docker 部署 Kafka 完整指南

Docker 部署 Kafka 完整指南 本指南将详细介绍如何使用 Docker 部署 Kafka 消息队列系统&#xff0c;包括单节点和集群模式的部署方式。 1. 单节点部署 (Zookeeper Kafka) 1.1 创建 docker-compose.yml 文件 version: 3.8services:zookeeper:image: bitnami/zookeeper:3.8…...

java学习总结(if switch for)

一.基本结构 1.单分支if int num 10; if (num > 5) {System.out.println("num 大于 5"); } 2.双分支if-else int score 60; if (score > 60) {System.out.println("及格"); } else {System.out.println("不及格"); } 3.多分支 int…...

解释:指数加权移动平均(EWMA)

指数加权移动平均&#xff08;EWMA, Exponential Weighted Moving Average&#xff09; 是一种常用于时间序列平滑、异常检测、过程控制等领域的统计方法。相比普通移动平均&#xff0c;它对最近的数据赋予更高权重&#xff0c;对旧数据逐渐“淡化”。 ✅ 一、通俗理解 想象你…...

open harmony多模组子系统分析

multimodalinput是open harmony的核心输入子系统&#xff0c;负责统一管理触摸屏&#xff0c;键盘&#xff0c;鼠标&#xff0c;手势&#xff0c;传感器等多种 输入源&#xff0c;提供标准化事件分发机制。其核心 目标是通过统一的事件处理框架&#xff0c;实现跨设备&#xff…...

Hello Java!

1. Java发展史 1.1 计算机编程语言分类 机器语言&#xff1a;电子机器能够直接识别的语言&#xff0c;无需经过翻译&#xff0c;计算机内部就有相应的电路来完成它&#xff1b;从使用的角度来看&#xff0c;机器语言是最低级的语言。 机器语言。指令以二进制代码形式存在。 汇…...

vue 入门:生命周期

文章目录 vue组件的生命周期创建阶段更新阶段销毁阶段生命周期钩子函数 vue组件的生命周期 创建阶段、销毁阶段&#xff1a;只会执行一次更新阶段&#xff1a;会执行多次 创建阶段 beforeCreate 在实例初始化之后&#xff0c;数据观测&#xff08;data observer&#xff09;…...

C#容器源码分析 --- Dictionary<TKey,TValue>

Dictionary<TKey, TValue> 是 System.Collections.Generic 命名空间下的高性能键值对集合&#xff0c;其核心实现基于​​哈希表​​和​​链地址法&#xff08;Separate Chaining&#xff09;。 .Net4.8 Dictionary<TKey,TValue>源码地址&#xff1a; dictionary…...

yum的基本操作和vim指令

在我们的手机端或者Windows上下载软件&#xff0c;可以在相应的应用商店或者官网进行下载&#xff0c;这样对于用户来说十分的方便和便捷。而在Linux上&#xff0c;也有类似的安装方式&#xff0c;我们来一一了解一下。 Linux安装软件的3种方法 源代码安装 在Linux下安装软件…...

MCU刷写——HEX与S19文件互转详解及Python实现

工作之余来写写关于MCU的Bootloader刷写的相关知识,以免忘记。今天就来聊聊Hex与S19这这两种文件互相转化,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走…...

深入探讨避免MQ消息重复消费的策略与实现

引言 随着微服务架构的流行&#xff0c;消息队列&#xff08;Message Queue, MQ&#xff09;作为系统间异步通信的重要手段&#xff0c;被广泛应用于各种场景。然而&#xff0c;在使用MQ的过程中&#xff0c;一个不容忽视的问题是消息可能被重复消费。这不仅可能导致数据不一致…...

定制一款国密浏览器(8):SM3 摘要算法

上一章我们讲到了铜锁和 BoringSSL,本章从最简单的国密算法 SM3 摘要算法入手,说明一下 SM3 算法的移植要点。 SM3 算法本身并不复杂,详细算法说明参考《GB∕T 32905-2016信息安全技术 SM3密码杂凑算法》这份文档。因为铜锁开源项目有实现代码,直接照搬过来。 将 crypto/…...

【Docker基础】Compose 使用手册:场景、文件与命令详解

文章目录 一、什么是 Docker Compose二、为什么需要 Docker Compose三、Docker Compose 使用步骤 / 核心功能步骤核心功能&#xff1a; 四、Docker Compose 的使用场景五、Docker Compose 文件&#xff08;docker-compose.yml&#xff09;文件语法版本文件基本结构及常见指令常…...

RT-2论文深度解读:视觉-语言-动作统一模型的机器人泛化革命

1. 核心问题与挑战 传统机器人学习存在两大瓶颈&#xff1a; 数据效率低下&#xff1a;依赖特定场景的机器人操作数据&#xff08;如抓取、推压&#xff09;&#xff0c;收集成本高泛化能力局限&#xff1a;模型仅能完成训练中出现过的任务&#xff0c;无法应对长尾场景 RT-…...

git 提交标签

Git 提交标签 提交消息格式&#xff1a; <type>: <description> &#xff08;示例&#xff1a;git commit -m "feat: add user login API"&#xff09; 标签适用场景feat新增功能&#xff08;Feature&#xff09;。fix修复 Bug&#xff08;Bug fix&…...

学习率(Learning Rate)

学习率&#xff08;Learning Rate&#xff09;是深度学习中最关键的超参数之一&#xff0c;它控制模型在每次参数更新时的“步长大小”。简单来说&#xff1a;它决定了模型从错误中学习的“速度”。 直观比喻 想象你在山顶蒙眼下山&#xff08;找最低点&#xff09;&#xff1…...

李宏毅NLP-3-语音识别part2-LAS

语音识别part2——LAS Listen Listen主要功能是提取内容信息&#xff0c;去除说话人差异和噪声 。编码器&#xff08;Encoder&#xff09;结构&#xff0c;输入是声学特征&#xff0c;经过 Encoder 处理后&#xff0c;输出为高级表示&#xff0c;这些高级表示可用于后续语音识别…...

游戏引擎学习第222天

回顾昨天的过场动画工作 我们正在制作一个游戏&#xff0c;目标是通过直播的方式完成整个游戏的开发。在昨天的工作中&#xff0c;我享受了制作过场动画的过程&#xff0c;所以今天我决定继续制作多个层次的过场动画。 昨天我们已经开始了多层次过场动画的基本制作&#xff0…...

双系统win11 + ubuntu,如何完全卸载ubuntu系统?

双系统win11 ubuntu&#xff0c;如何完全卸载ubuntu? 注意事项 操作前确保有 Windows 安装介质&#xff08;USB&#xff09;&#xff0c;以防需要修复对 EFI 分区的操作要格外小心如果使用 BitLocker&#xff0c;可能需要先暂停保护如果遇到问题&#xff0c;可以使用 Windows…...

【T2I】Region-Aware Text-to-Image Generation via Hard Binding and Soft Refinement

code&#xff1a; https://github.com/NJU-PCALab/RAG-Diffusion Abstract 区域提示&#xff0c;或组成生成&#xff0c;能够实现细粒度的空间控制&#xff0c;在实际应用中越来越受到关注。然而&#xff0c;以前的方法要么引入了额外的可训练模块&#xff0c;因此只适用于特定…...

HarmonyOS:Map Kit简介

一、概述 Map Kit&#xff08;地图服务&#xff09; 为开发者提供强大而便捷的地图能力&#xff0c;助力全球开发者实现个性化显示地图、位置搜索和路径规划等功能&#xff0c;轻松完成地图构建工作。您可以轻松地在HarmonyOS应用/元服务中集成地图相关的功能&#xff0c;全方位…...

【从零实现高并发内存池】- 项目介绍、原理 及 内存池详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

CSS margin(外边距)学习笔记

CSS 中的 margin 属性用于定义元素周围的空白区域&#xff0c;它是一个非常重要的布局工具&#xff0c;可以帮助我们控制元素之间的间距&#xff0c;从而实现更美观和易用的页面布局。以下是对 margin 属性的详细学习笔记。 一、margin 的基本概念 margin 是元素周围的透明区…...

【数据集】中国各省低空经济及无人机相关数据集(1996-2025年2月)

低空经济泛指3000米高空以下的飞行经济活动&#xff0c;以民用客运飞行器和无人驾驶航空器为主。低空经济产业是先进飞行器出行&#xff08;AAM&#xff09;在城市低空运行的一种变革性和颠覆性的复合新产业&#xff0c;主要以垂直起降型飞机&#xff08;VTOL&#xff09;与无人…...

C++动态分配内存知识点!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好呀&#xff0c;又是分享干货的时间&#xff0c;今天我们来学习一下动态分配内存。 文章目录 1.动态分配内存的思想 2.动态分配内存的概念 2.1内存分配函数 2.2动态内存的申请和释放 2.3内存碎片问…...

哈喽打车 小程序 分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向过程 这一次遇到这种风控感觉挺有…...

泛型的二三事

泛型&#xff08;Generics&#xff09;是Java语言的一个重要特性&#xff0c;它允许在定义类、接口和方法时使用类型参数&#xff08;Type Parameters&#xff09;&#xff0c;从而实现类型安全的代码重用。泛型在Java 5中被引入&#xff0c;极大地增强了代码的灵活性和安全性。…...