自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 收藏
  • 关注

原创 【C++11】智能指针详解

本文主要探讨C++中的内存泄漏问题及其解决方案。首先分析了内存泄漏的两种类型:堆内存泄漏和系统资源泄漏,指出其对长期运行程序的危害性。随后介绍了预防内存泄漏的四种方法,重点阐述了RAII(资源获取即初始化)思想的核心价值。文章通过代码示例展示了传统new/delete方式的局限性,以及RAII封装如何解决异常情况下的资源释放问题。进一步分析了auto_ptr的设计缺陷(管理权转移)及其被废弃的原因,最后介绍了C++11引入的unique_ptr智能指针,通过禁止拷贝和赋值操作从根本上避免了资源管理问题。全文

2026-01-03 14:39:13 474

原创 【C++11】C++11重要新特性详解

C++11新特性摘要 C++11引入了多项重要特性,主要包括: {}初始化:扩展列表初始化适用范围,支持所有内置和自定义类型,可隐式调用构造函数,但需注意explicit限制。 initializer_list:标准库模板类,支持花括号列表作为参数,简化容器初始化(如vector{1,2,3}),底层通过指针引用常量数组实现。 auto类型推导:自动推断变量类型,适用于长类型(如迭代器)、lambda表达式等场景,但需注意const/引用属性丢失问题。 decltype:获取表达式类型,保留完整类型信息,常

2026-01-02 12:59:03 831

原创 【Linux】高级IO

Linux高级I/O模型解析 本文系统介绍了Linux系统中的五种I/O模型及其特点: 阻塞I/O:默认方式,调用会一直等待数据就绪,简单但效率低 非阻塞I/O:未就绪时立即返回错误,需循环轮询,CPU消耗大 信号驱动I/O:内核通过SIGIO通知应用,但信号处理复杂 I/O多路复用:select/poll/epoll监控多个描述符,高并发处理能力强 异步I/O:内核完成所有操作后通知应用,真正的异步方式 文章详细分析了同步与异步、阻塞与非阻塞的区别,指出前四种模型本质上都属于同步I/O。特别介绍了fcnt

2025-10-14 21:00:49 901

原创 【Linux网络】IP协议

IP协议是TCP/IP协议族的核心协议之一,负责数据在网络中的寻址和路由传输。文章首先介绍了IP协议的基本概念,指出其本质是提供主机间数据传输能力,但无法保证可靠性,需依赖上层协议如TCP实现。接着详细解析了IPv4报文格式,包括版本号、首部长度、服务类型、分片标识、生存时间等关键字段。在IP地址部分,重点阐述了网段划分原理,从早期的分类编址到现代的CIDR方案,并解释了子网掩码的作用。此外,还介绍了特殊IP地址(如网络号、广播地址)和IP地址数量限制问题,提出了动态分配、NAT技术和IPv6三种解决方案。

2025-10-05 22:31:18 1042

原创 【Linux网络】TCP协议

TCP协议是互联网中面向连接、可靠的传输层协议,通过确认应答、超时重传等机制确保数据有序无差错传输。其协议格式复杂,包含源/目的端口、序号、确认号、窗口大小等字段,以及SYN、ACK、FIN等6个控制标记位。TCP采用全双工通信,拥有发送和接收缓冲区,通过滑动窗口机制实现流量控制。关键机制包括:确认应答(通过序号/确认号确保数据可靠传输)、超时重传(未收到应答时重发数据)、流量控制(通过窗口大小动态调整发送速率)等。这些特性使TCP成为网页浏览、邮件传输等应用的基础协议。

2025-09-29 22:58:01 809

原创 【Linux网络】UDP协议

UDP协议是一种基础的传输层协议,其特点包括无连接、不可靠和面向数据包。UDP协议通过16位的端口号标识进程通信,报头固定为8字节,包含源/目的端口、长度和校验和等信息。UDP没有发送缓冲区,但系统维护发送队列;接收缓冲区可能乱序且容量有限。由于UDP报文最大长度限制为64KB,传输大数据需分包处理。常见基于UDP的应用层协议有DNS、DHCP、TFTP等。相比TCP,UDP虽不可靠但效率更高,适用于实时性要求高的场景。

2025-09-23 20:09:16 1002

原创 【Linux网络】HTTP协议

HTTP协议摘要: HTTP(超文本传输协议)是互联网最广泛使用的应用层协议,定义了客户端与服务器之间传输超文本(如网页、图片等)的通信规则。URL(统一资源定位符)是互联网资源的标准地址,包含协议、域名、路径等组件,特殊字符需要进行urlencode编码。HTTP请求由请求行(方法+URL+版本)、请求头和请求体组成,常见方法有GET(参数在URL中)和POST(参数在请求体中)。HTML表单可通过method属性指定使用GET或POST方式提交数据。HTTP协议因其通用性,不仅用于浏览器与服务器通信,也

2025-09-18 17:52:05 859

原创 【Linux网络】简易应用层协议定制

文章摘要 本文介绍了网络编程中的序列化与反序列化概念,重点讲解了如何通过自定义应用层协议实现一个简单的网络计算器服务。主要内容包括: 序列化与反序列化的定义:将内存中的对象转换为可传输格式(序列化)及其逆向过程(反序列化),解决TCP字节流传输中的消息定界问题。 网络计算器实现:通过socket搭建TCP服务框架,设计Request(包含两个操作数和运算符)和Response(包含结果和状态码)结构体作为通信数据。 协议设计要点: 使用字符串作为序列化格式 通过特殊字符或长度前缀实现消息定界 处理不同系统间

2025-09-13 21:59:18 1047

原创 【Linux网络】Socket编程

Socket是网络通信的基础接口,由IP地址、端口号和协议类型组成。IP地址用于标识网络设备,端口号用于标识主机中的进程。传输层协议主要有TCP(可靠连接)和UDP(简单快速)。网络通信统一使用大端字节序,需通过专用函数转换。Socket编程接口中,UDP协议相对简单,主要涉及socket()创建套接字、bind()绑定地址、recvfrom()接收数据和sendto()发送数据。通过初始化sockaddr_in结构体配置IP和端口,可实现基本网络通信功能。

2025-09-05 00:55:24 1128

原创 【Linux网络】网络基础

摘要: 计算机网络诞生于20世纪40年代,最初为军事用途,后逐步开放。早期计算机独立运行,后通过连接形成局域网(LAN)和广域网(WAN)。网络协议是计算机通信的约定标准,采用分层结构(如OSI七层模型和简化的TCP/IP五层模型)实现解耦和高效维护。MAC地址是设备的物理唯一标识,用于局域网直接寻址;IP地址则是逻辑地址,屏蔽物理差异,实现跨网络通信。IPv4为主流,但IPv6因地址耗尽问题逐渐普及。协议分层和地址体系共同支撑了现代互联网的高效通信。

2025-08-27 20:23:06 695

原创 【Linux】线程

文章摘要: 本文首先介绍了线程的概念,指出线程是进程内部的执行流,共享进程资源但拥有独立的执行堆栈和寄存器状态。Linux通过轻量级进程(LWP)模拟线程,复用进程的数据结构实现高效调度。随后探讨了多级页表的设计原理,说明其如何通过分层映射节省内存空间。接着分析了线程比进程更轻量化的原因,包括创建/切换开销更低以及缓存利用率更高。最后详细讲解了Linux中通过pthread库创建线程的方法,并附代码示例演示线程创建与运行。全文从理论到实践,系统性地阐述了线程的核心概念与实现机制。 (字数:149)

2025-08-22 15:17:02 1054

原创 【Linux】信号

Linux信号机制概述 Linux信号是一种异步事件通知机制,允许操作系统内核或进程间发送通知。信号具有以下特点:1) 进程必须预先具备识别和处理信号的能力;2) 信号处理可能延迟执行;3) 进程需要保存已发生但未处理的信号。信号分为普通信号(1-31)和实时信号(34-64)。 信号可以通过多种方式产生,包括键盘组合键(如Ctrl+C发送SIGINT)和系统调用。进程处理信号有三种方式:默认行为、忽略或自定义处理。值得注意的是,9号(SIGKILL)和19号(SIGSTOP)信号不可被捕获、阻塞或忽略,确

2025-08-10 01:23:33 333

原创 【Linux】进程通信

进程间通信的必要性与实现方式 进程间通信(IPC)是实现多进程协作的关键机制,其必要性源于进程独立性与系统协同需求的矛盾。Linux系统中主要通过管道实现进程间通信,分为匿名管道和命名管道两种形式。 匿名管道的核心原理是利用内存级文件实现数据共享,通过fork()创建的子进程继承父进程的文件描述符,使父子进程共享同一内核缓冲区。管道采用半双工通信模式,要求通信双方固定读写角色,通过关闭不需要的文件描述符确保单向通信。其特点包括: 仅适用于有亲缘关系的进程 通信数据不持久化,随进程结束而释放 采用阻塞式读写机

2025-08-04 03:41:54 1001

原创 【Linux】基础IO

文件操作与C语言文件函数摘要 文件是存储在外部介质上的数据集合,由文件名标识。即使空文件也会占用存储空间,因为需要保存文件属性。文件可分为打开和未打开两种状态:未打开文件存储在外设(如硬盘)中,打开文件则被加载到内存并由进程管理。 C语言提供多种文件操作函数: fopen() - 打开文件,支持多种模式(r/r+/w/w+/a/a+) fclose() - 关闭文件流 fwrite() - 向文件写入数据 fread() - 从文件读取数据 文件操作模式决定了行为特点:w模式会清空文件内容再写入,a模式则在

2025-07-27 03:44:25 1007

原创 【Linux】进程详解

本文介绍了进程的概念及其管理机制。进程是程序执行的实例,由进程控制块(PCB)、代码和数据组成,是操作系统资源分配的基本单位。Linux中的PCB称为task_struct,以链表等多种形式组织。查看进程常用ps、top命令和/proc目录。通过fork()系统调用可创建子进程,父子进程共享代码段但数据段采用写时拷贝机制保持独立。bash进程作为命令行解释器,是用户创建进程的父进程。操作系统采用"先描述再组织"的管理思路,将抽象资源转化为统一数据结构进行管理。

2025-07-17 02:43:33 906

原创 【Linux】冯诺依曼体系

冯诺依曼体系是现代计算机的基础架构,由输入设备、输出设备、存储器、运算器和控制器五大模块组成。存储器(内存)作为数据中转站,运算器和控制器构成CPU核心。存储金字塔展示了计算机存储层级结构,通过成本与性能的平衡优化CPU利用率。Linux系统则采用分层管理,硬件驱动按标准提供信息,操作系统通过系统调用接口管理硬件,为用户提供安全稳定的执行环境,最终用户通过封装后的指令进行操作。该体系奠定了计算机软硬件协同工作的理论基础。

2025-06-22 14:53:31 850

原创 【Linux】gdb调试器

本文介绍了GNU调试工具gdb的基本使用方法。gdb是Linux系统下功能强大的命令行调试工具,主要用于C/C++程序的调试。文章详细讲解了如何编译debug版本程序、进入和退出调试状态、代码打印、运行程序、打断点管理(包括查看、启用/禁用断点)、逐过程(n)和逐语句(s)调试技巧。此外还涵盖了变量打印与监控、快速跳过代码段(until)、函数快速执行(finish)、修改变量值(set var)以及查看调用堆栈(bt)等实用功能。这些功能帮助开发者高效定位程序错误,尤其适合Linux环境下文本界面的调试工

2025-06-21 17:17:02 859

原创 【Linux】git基础操作

本文介绍了Git的基本概念及其在Linux环境下的使用。Git是一款强大的代码历史管理和团队协作工具,能够跟踪文件变化并记录完整修改历史。文章详细讲解了如何在Linux上安装Git、配置用户信息、本地仓库初始化、文件提交等基础操作,并说明了如何将代码托管到远程仓库(如Gitee)。此外,还介绍了.gitignore文件的作用及使用方法,帮助过滤无需版本控制的文件。通过这篇指南,读者可以快速掌握Git的核心功能和使用流程,提高代码管理效率。

2025-06-13 13:32:00 1071

原创 【Linux】Makefile

Makefile是一种自动化构建工具,用于管理项目的编译和链接过程。文章介绍了Makefile的基本格式、工作原理及优化技巧。主要内容包括: 基本格式:目标文件与依赖文件的定义及编译指令 特殊符号使用:$@表示目标,$^表示依赖文件 文件时间机制:系统通过比较文件修改时间决定是否重新编译 伪目标声明:.PHONY用于定义总是执行的指令(如clean) 多层依赖:展示如何分步实现从源代码到可执行文件的完整编译流程 文章通过实例演示了Makefile的使用方法,并强调了合理使用.PHONY的重要性,同时解释了系

2025-06-09 23:55:19 1041

原创 【Linux】gcc、g++编译器

GCC和G++是Linux中常用的C/C++编译器,GCC专用于C语言,G++兼容C和C++。编译过程分为预处理(去注释、宏替换等)、编译(生成汇编代码)、汇编(生成机器码)、链接(连接库函数)。Linux默认使用动态链接库(共享库),节省内存但依赖性强;静态链接库独立但占用空间大。可通过安装静态库并使用-static选项进行静态编译。文件后缀(如.i、.s、.o)有助于编译器识别处理阶段,file指令可查看文件详细信息。

2025-06-08 12:41:42 1241

原创 【Linux】centos软件安装

摘要:本文介绍了Linux系统下三种安装软件的方法,重点推荐适合初学者的yum工具。yum是基于RPM包管理的前端工具,能自动解决依赖关系,常用指令包括安装(yum install)和卸载(yum remove)。文章演示了通过yum安装lrzsz文件传输软件的过程,并讲解了yum源配置文件的位置和作用。此外还介绍了如何配置epel-release第三方软件源来扩展可用软件库。最后说明通过yum list可查看可用软件列表,其中@os表示官方源,epel表示第三方源。

2025-06-04 17:41:13 1184

原创 【Linux】Linux权限

Linux用户与文件权限管理摘要 Linux系统包含root和普通用户两种账户类型,root拥有最高权限。用户切换可通过su命令(su -切换完整环境)或sudo临时提权(需在白名单中)。文件权限由拥有者、所属组和其他用户三角色构成,通过ls -l查看的9位权限字符分别对应三类角色的读写执行权限(rwx)。权限修改工具包括: chmod(字符/八进制形式修改权限) chown(修改所有者,需root权限) chgrp(修改所属组,需root权限) 新建文件默认权限受umask影响(默认002),目录初始77

2025-06-04 11:49:08 1122

原创 【Linux】linux基础指令

本文介绍了Linux系统中常用的用户管理和文件操作命令,主要包括: 用户管理命令: useradd:创建新用户 passwd:设置用户密码 userdel:删除用户(建议使用-r选项递归删除) 文件操作命令: ls:列出目录内容(常用选项:-a显示隐藏文件、-l显示详细信息) pwd:显示当前目录 cd:切换目录 touch:创建新文件 mkdir:创建目录(-p可创建多级目录) rm:删除文件/目录(-r递归删除) cp:复制文件/目录 其他实用命令: man:查看命令手册 路径说明:解释了绝对路径和相对

2025-06-03 12:13:29 1106

原创 【c++】【数据结构】红黑树

红黑树是一种通过颜色标记节点来维持平衡的二叉搜索树,其核心规则包括:根节点为黑色、红节点的子节点必须为黑、从任一节点到叶节点的路径包含相同数目的黑节点。这些约束确保最长路径不超过最短路径的两倍。文章给出红黑树的部分C++实现代码,包含节点插入逻辑和四种旋转操作(左旋、右旋、左右旋、右左旋)来维护平衡。代码中还实现了平衡性检查功能,通过递归验证颜色规则和黑节点计数一致性。红黑树通过这种机制在动态操作中保持高效查找性能,时间复杂度稳定在O(log n)。

2025-05-28 15:09:30 1077

原创 【c++】【数据结构】AVL树

AVL树是一种自平衡二叉搜索树,通过平衡因子和旋转操作动态维持平衡,解决了普通二叉搜索树在极端情况下效率低下的问题。本文介绍了AVL树的基本概念,并给出了C++的部分实现代码,包括节点定义、插入操作以及四种旋转操作(左旋、右旋、左右旋和右左旋)的实现逻辑。实现中通过平衡因子判断和调整树的结构,确保插入后仍保持平衡特性。代码还包含中序遍历、树高计算和平衡检查等辅助功能,为构建高效的搜索数据结构提供了基础实现框架。

2025-05-28 00:41:33 1034

原创 【c++】异常详解

C语言处理错误的方式存在局限性,主要通过assert和打印错误码来实现。assert在debug版中有效,但在release版中无效,且直接终止程序的方式过于暴力。打印错误码的方式虽然不会终止程序,但错误码可读性差,且全局变量errno容易被覆盖,导致错误处理繁琐。C++引入了异常机制来替代C语言的错误处理方式,异常通过throw、try和catch关键字实现,允许函数在无法处理错误时抛出异常,并由调用者处理。异常机制支持多种类型的异常抛出和捕获,且可以通过栈展开在函数调用链中匹配异常。C++还提供了异常规

2025-05-12 19:55:37 1206 1

原创 【c++】【数据结构】二叉搜索树详解

二叉搜索树(BST)是一种特殊的二叉树,具有以下性质:左子树的所有节点值小于根节点,右子树的所有节点值大于根节点,且左右子树也分别为二叉搜索树。BST的查找效率理想情况下为O(logN),但若树结构不平衡(如退化为链表),效率将降至O(N)。为解决这一问题,后续发展出AVL树和红黑树等平衡二叉搜索树。 本文还提供了二叉搜索树的C++模拟实现,包括插入、查找、删除等基本操作,并支持递归和非递归实现。代码展示了如何通过比较节点值进行搜索和插入,以及如何处理删除操作中的不同情况(如节点无子节点、有单个子节点或有两

2025-05-11 14:56:45 1010

原创 【c++】多态详解

多态是面向对象编程中的一个重要概念,指的是同一操作在不同对象上产生不同的行为。在C++中,多态通过基类的指针或引用调用虚函数实现,派生类可以重写这些虚函数以提供不同的功能。多态的构成需要满足两个条件:必须通过基类的指针或引用调用虚函数,且被调用的函数必须是虚函数并经过派生类重写。虚函数通过在函数声明前加virtual关键字定义,重写要求函数名、参数列表和返回值类型完全相同。C++11引入了override和final关键字,分别用于确保函数重写正确和防止函数被重写。此外,抽象类包含纯虚函数,不能实例化对象,

2025-05-10 16:54:32 1558

原创 【c++】继承详解

说到继承,套用到生活中,我们尝常常会想到继承财产这样的场景。c++中也是如此,它允许程序员在保持原有类特性的基础上进行扩展。因为我们会遇到多个类具有部分相同的成员函数和成员变量,此时一个一个写未免有点累,此时我们将这些类中都会有的成员变量和函数定义出一个类,再创建我们想要的类,这些类继承自最开始创建的类。最开始创建的类就叫父类,之后继承父类的就叫子类,或者叫派生类。这样子类就不用再写父类中的成员了,这些成员都被继承进了子类中。

2025-05-08 18:32:35 1141

原创 【c++】模板详解

提到模板就不得不提泛型编程的概念,泛型编程即编写一段与类型无关的通用代码,使得各种类型的参数都可以复用这段代码,从而顺利偷懒,提升编程效率。

2025-05-03 23:13:37 1426

原创 【c++】【STL】priority_queue详解

priority_queue翻译过来就是优先级队列,是stl提供的一个容器适配器,也就是我们数据结构中学到的栈,是一种常用的数据结构,特点是利用类似二叉树的结构让父节点元素比子节点大,从而使对顶元素最大(小)。

2025-05-02 22:47:36 1070

原创 【c++】【STL】queue详解

queue是stl库提供的一种容器适配器,也就是我们数据结构中学到的队列,是非常常用的数据结构,特点是遵循LILO(last in last out,也就是后进后出)原则。

2025-05-01 22:32:36 769

原创 【c++】【STL】stack详解

stack是stl库提供的一种容器适配器,也就是我们数据结构中学到的栈,是非常常用的数据结构,特点是遵循LIFO(last in first out,也就是后进先出)原则。

2025-05-01 22:17:28 903

原创 【c++】【STL】list详解

list是c++的stl库提供的链表容器,链表作为我们熟知的数据结构之一,其与顺序表相比,在任意位置插入删除方面具有绝对的优势,但在随机读取方面不如顺序表,两者属于互补关系

2025-04-30 23:07:56 1494

原创 【c++】【STL】vector详解

vector是c++提供的顺序表容器,也就是可变大小数组的序列容器。是c++中经常使用,非常方便的stl容器。

2025-04-24 20:29:14 891

原创 【c++】string类详解

string类是c++标准库中提供的类,可以方便快捷的处理字符串,得益于c++提供了面向对象的类,相较于C语言只依靠面向过程的函数而言,功能性、安全性、书写舒适度都更上一层楼。string类拥有自己的头文件,要使用时务必包含。

2025-02-21 17:21:56 1095

原创 【c++】c++内存管理

realloc的扩容分为两种情况,原地扩和异地扩,因为开辟的空间要求是连续的,而堆上操作系统管理的内存并不一定就是连续的,当需要调整的空间后面有连续的空间且容纳的下扩容后的空间就直接原地扩容,以上条件不能满足时系统就会在另一边地方开辟size大小的空间,再把ptr上的数据拷贝过来完成拷贝。malloc可以在堆上开辟指定内存的空间,参数是要开辟的空间的大小(单位字节),返回开辟好的空间的指针,注意返回的是无类型指针,需要强转一下指针类型,malloc也不会对开辟好的空间进行初始化。

2025-02-17 14:01:27 1113 2

原创 【c++】类与对象详解

类是面向对象编程中对具有相同属性和行为的一组事物的抽象描述,它定义了数据成员(属性)和成员函数(行为),是创建对象的模板;而对象是类的具体实例,依据类的定义在内存中被创建,拥有类所规定的属性和行为,且每个对象的属性值可以不同,能通过调用成员函数来执行特定操作。

2025-02-02 18:44:25 1316

原创 【数据结构】排序

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

2025-01-19 20:32:41 970 2

原创 【数据结构】堆与二叉树

树是一种非线性的数据结构,它是由n(n >= 0)个有限结点组成的一个具有层次关系的集合。它看起来像一个倒挂的树。二叉树最上面的结点被称为根节点,根节点没有前驱结点,也就是根结点之上没有节点。除根结点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1

2025-01-17 22:25:33 1089 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除