C++11智能指针
代码仓库shanchuann/CPP-Learninng C++11标准依托右值引用、移动语义两大核心语法特性,搭建起一套完备、安全且高效的智能指针体系,彻底解决了传统裸指针在内存管理中的内存泄漏、重复释放、悬空指针等核心痛点,覆盖独占管理、共享管理、循环引用防护等全场景开发需求,是现代C++工程开发中内存管理的标准方案。实际使用时需包含<memory>头文件,整套体系包含三类智能指针,三者各司其职、相互配合,分别适配不同的资源管理逻辑,全面满足日常开发的各类内存管控需求。 unique_ptr独占式智能指针unique_ptr是C++11推出的独占所有权型智能指针,专门替代C++98中存在严重设计缺陷的auto_ptr,也是日常开发中独占式资源管理的首选方案。其核心规则为同一时间仅允许一个指针持有资源所有权,安全性与运行效率远超传统裸指针与旧版auto_ptr,从根源规避了独占资源的非法共享问题。 特点 排他所有权模式:两个指针绝对不能指向同一个资源,从根源杜绝重复释放、悬空指针问题; 禁用拷贝语义:不提供拷贝构造函数与左值赋值重载,禁止值拷贝传递,阻...
auto_ptr
基础理论内存泄漏内存泄漏是C++程序中动态分配的堆内存,因程序逻辑疏漏未释放或无法释放,导致堆内存持续占用、无法复用的异常现象,长期累积会引发程序运行效率降低、系统资源耗尽乃至程序崩溃等严重后果,是C++内存管理的主要痛点。依据泄漏资源的类型,可将其划分为两类,二者均会对系统稳定性造成不可逆影响。 第一类为堆内存泄漏,也是工程中最常见的泄漏类型,指程序在堆空间申请内存资源后,使用完毕未执行释放操作,导致该块内存被系统标记为占用状态,后续无法被当前程序或其他程序复用,是狭义层面常说的内存泄漏。第二类为资源泄漏,针对操作系统有限的非内存类资源,包括网络套接字、文件描述符、互斥锁、句柄等,这类资源属于系统全局稀缺资源,若创建后未正常归还系统,持续累积会直接耗尽系统资源池,导致后续程序无法申请对应资源,引发系统级功能异常。 裸指针的固有缺陷C++原生裸指针不具备内存自动管理能力,使用过程中存在六大难以规避的底层缺陷,也是智能指针得以提出的重要动因,各类缺陷均会直接引发内存异常或程序未定义行为:其一,无法自主区分指针指向单个对象还是对象数组,易造成内存释放方式选择失误;其二,无法判断指针是...
容器适配器
容器适配器是STL中基于底层容器的接口封装,不独立存储。它通过封装deque等容器,实现了栈、队列和优先队列,屏蔽底层细节,提供便捷操作。
无序容器
代码仓库shanchuann/CPP-Learninng 引言在C++标准模板库(STL)中,关联容器分为有序与无序两大类,无序关联容器依托哈希表实现,主打快速的查找、插入与删除操作,和有序关联容器(map、set)的关键差异在于不维护元素的排序规则,存储顺序由哈希函数决定。这类容器适配大量需要高效存取、不关注元素顺序的业务场景,也是哈希表思想在工程实践中的典型落地应用,和此前讲解的链式哈希底层逻辑高度契合,理解无序容器能更好地串联哈希表理论与STL实际使用。 无序容器基础认知容器分类与底层逻辑STL提供四类无序关联容器,均基于哈希表搭建,依靠哈希函数完成键到存储位置的映射,通过链地址法解决哈希冲突,和手动实现的链式哈希原理完全一致,四类容器分工明确,适配不同存储需求: unordered_map:存储键值对,键唯一不重复,支持键值映射与快速查找 unordered_multimap:存储键值对,键允许重复,适配一对多的映射场景 unordered_set:存储单一元素,元素唯一不重复,主打元素存在性校验 unordered_multiset:存储单一元素,元素允...
链式哈希
代码仓库shanchuann/CPP-Learninng 引言哈希表作为经典的散列类存储数据结构,通过哈希函数完成关键字与存储地址的直接映射,可在平均时间复杂度下实现常数级的查找、插入与删除操作,在分布式缓存、数据库索引、键值存储系统等工程领域具备广泛应用价值。哈希冲突是哈希表设计中不可规避的关键技术问题,链地址法(又称链式哈希)作为解决哈希冲突的主流方案,其主要设计思路为将哈希映射结果一致的关键字以单链表结构串联,使每个哈希桶位对应一条独立链表,以此规避开放寻址法存在的寻址堆积、空间利用率低等缺陷。本文基于标准C语言实现的链式哈希完整源码,系统阐述链式哈希的基础理论原理,对源码的数据结构定义、基础工具函数、操作逻辑、动态扩容机制及内存管理方案进行逐模块、逐流程的详尽解析,同时梳理工程实现中的边界条件处理与性能优化思路,为哈希表的工程化落地与底层原理学习提供完整参考。 链式哈希基础理论哈希表与哈希冲突哈希表依托哈希函数,将输入关键字Key映射至预设范围内的离散哈希地址,实现关键字与存储位置的直接关联,理想状态下可达到O(1)时间复杂度的高效存取。但受哈希函数离散性能...
一致性哈希
代码仓库shanchuann/CPP-Learninng 引言在分布式缓存、分布式存储、负载均衡等典型分布式系统场景中,服务集群的动态扩容与缩容是常态化运维操作。此类场景的核心诉求为:节点拓扑结构变更时,最大限度降低数据与节点映射关系的变动幅度,规避缓存大规模失效、数据重复调度及流量雪崩等问题,保障系统持续稳定运行与高可用特性。传统哈希取模算法作为基础节点路由方案,在动态集群场景下易引发集群稳定性故障,这也是一致性哈希算法提出的重要动因。本文从传统路由算法的固有缺陷切入,系统阐释一致性哈希算法的工作原理、主流优化策略与可工程化实现的代码逻辑,补充实际落地细节,全面覆盖该算法的理论体系与实践应用维度。 传统哈希取模哈希取模算法是传统分布式节点路由的常用实现方案,其运算公式为:hash(key) % nodes_count,式中key表征数据或请求的唯一标识,nodes_count表征集群总节点数量。该算法具备逻辑简洁、部署成本低的优势,但在节点动态变更的实际应用场景中,存在难以规避的固有缺陷,具体表现如下: 全局映射关系失效:集群新增或移除单个节点时,总节点数nod...
有序关联容器
本文对比了deque与list的迭代器稳定性与效率,解析了基于红黑树的有序关联容器特性,并介绍了std::pair在键值对存储中的核心作用。
标准模板库list
本文详解C++ STL list容器,基于双向链表实现,核心优势是任意位置O(1)的插入删除。文章从底层节点结构到接口实操,全面剖析其特性与应用场景。
标准模板库deque
代码仓库shanchuann/CPP-Learninng 在C++ STL的序列容器家族中,vector凭借极致的随机访问性能成为了绝大多数场景的首选,但它有一个致命短板:头部插入与删除操作的时间复杂度为O(n),在需要频繁双端操作的场景下效率极低。而deque(double-ended queue,双端队列)正是为解决这个问题而生的容器,它既保留了vector的随机访问能力,又实现了头尾两端O(1)时间复杂度的增删操作,是STL中平衡性能与灵活性的经典设计,也是很多开发者容易忽略却实用性极强的核心组件。 deque属于STL序列容器,采用分段连续存储的设计思路,核心设计目标十分明确,既要兼顾随机访问的便利性,又要解决vector头部操作低效的问题,同时优化扩容性能。它与vector最本质的区别在于内存布局:vector要求所有元素存储在一整块连续的内存空间中,而deque的元素分散存储在多块固定大小的连续缓冲区里,再通过一个小型主控结构维护这些缓冲区的逻辑顺序,这也是它能实现双端高效操作的核心原因。 依托这样的设计,deque完美兼顾了三大核心优势:保留vecto...
标准模板库vector
代码仓库shanchuann/CPP-Learninng 在C++的标准模板库(STL)中,vector无疑是最常用、最基础的容器之一。它以动态数组的形式实现,既拥有数组般高效的随机访问能力,又能灵活地动态调整大小,是绝大多数场景下存储序列数据的首选。本文将从底层实现原理出发,全面剖析vector的核心机制、接口使用、性能优化以及常见陷阱,帮助你彻底掌握这个强大的容器。 STL(Standard Template Library,标准模板库)是C++标准库的核心组成部分,它通过模板技术将常用的数据结构与算法实现了分离,让开发者可以直接复用高效、通用的组件,而无需重复造轮子。 vector正是STL容器家族中的明星成员。它的本质是一个动态管理的连续内存数组,这意味着: 它支持像原生数组一样的O(1)时间复杂度随机访问; 它可以在运行时自动调整大小,无需开发者手动管理内存; 它的内存布局完全连续,因此可以完美兼容C风格的接口; 它在尾部添加或删除元素的效率极高(通常为O(1)),但在中间位置插入或删除元素则需要移动大量数据(O(n))。 这些特性使得vector成为...



