自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【读书笔记】Effective C++ 条款9:绝不在构造和析构过程中调用虚函数

场景结果原因构造中调用纯虚函数链接错误找不到纯虚函数实现构造中调用普通虚函数调用基类版本,非预期行为派生类尚未构造间接调用纯虚函数运行时abort编译器无法在链接期检测。

2026-04-14 15:59:36 260

原创 【高并发服务器项目】2.服务器业务层设计详解

作用:有连接进来时调用,将连接中的any类型设置为,用于存储反序列化草稿,实现自定义协议。

2026-04-07 22:37:23 415

原创 【MySQL】5. 数据更新与查询详解

MySQL 可以看作"一切皆表",每一个步骤的结果都可以视为一张表。:员工 JONES 不参与统计,统计平均薪资小于 2000 的部门。在所有数据处理完成后最后执行,属于"临门一脚"的显示操作。,因为数据库可能在远端服务器,数据量大时会消耗大量带宽。中只能直接显示这两个字段,其他字段会出现多对一问题。仅用于查询显示,不会实际删除表中的重复数据。会生成一列全为 1 的临时表,行数与。定义的别名,必须使用原始表达式。左侧为列名,右侧可以是表达式。表后,计数器重置为 0。— 有冲突,先删除后插入。

2026-04-07 22:26:58 409

原创 【MySQL】4. 数据约束详解

约束的作用:用约束让未来插入数据库中的数据符合预期,即通过倒逼程序员插入更规范的数据来保证数据质量。

2026-04-06 22:36:51 389

原创 【高并发服务器项目】1.服务器接入层代码详解

Epoll 的核心机制:红黑树、就绪队列、回调函数ET vs LT 模式:ET 通过倒逼程序员写出更高效的代码来提升性能Reactor 模式:一个连接由指定的一个线程完成所有读写事件核心类设计:Channel、Poller、TimeWheel、EventLoop、Connection、Acceptor、TcpServer 各司其职项目亮点时钟计时(timerfd)时间轮智能指针管理超时连接eventfd 及时唤醒阻塞线程Any 类的类型擦除实现RunInLoop 保证任务在正确的线程执行。

2026-04-05 12:10:42 407

原创 【MySQL】3.数据类型详解

- 1 个中文字符(UTF-8 占 3 字节,但算 1 个字符)WHERE FIND_IN_SET('唱', hobby) AND FIND_IN_SET('跳', hobby);INSERT INTO t12 VALUES('乙', '男', '唱,跳');-- 2 个中文字符。INSERT INTO t12 VALUES('甲', '男', '唱');INSERT INTO t12 VALUES('丙', '1', '3');hobby SET('唱', '跳', 'rap', '篮球')

2026-04-04 22:50:36 391

原创 【mysql】2.数据表操作

改名和删除操作不可逆,在生产环境中需要谨慎执行删除字段前建议先备份相关数据建议在测试环境验证后再到生产环境执行。

2026-03-29 21:12:25 369 1

原创 【读书笔记】Effective C++ 条款8:别让异常逃离析构函数

的设计:资源管理类负责自动释放资源,但异常处理的责任交给用户主动调用接口来完成。接口,那么析构时出现异常,责任在用户——因为他本来有机会去调用。的析构还在继续,此时就有两个异常同时存在,因此程序会被终止。:采用这种方案,必须确保吞掉异常后,程序仍然能够正常运行。此外,析构函数抛出异常可能导致内存释放不彻底,造成。等容器在析构时不能抛出异常,否则程序直接终止。:同时存在两个未处理的异常时,程序会终止。接口,就有充足的时间去处理可能抛出的异常。的析构函数就可能抛出异常,这很麻烦。捕获异常但不传播,仅记录日志。

2026-03-29 16:26:04 202

原创 【mysql】1.库的操作

数据库文件默认存储在目录下。可以使用查看该目录下的文件。

2026-03-26 22:09:35 403

原创 【网络】8.五种 I/O 模型与多路转接详解

接口作用创建 epoll 实例,返回文件描述符控制 epoll 实例:添加、修改、删除监视的 fd 和事件等待事件就绪,返回就绪的事件列表。

2026-03-24 17:38:17 400

原创 【网络】7.数据链路层:MAC 帧与 ARP 协议详解

2字节 2字节 1字节 1字节 2字节 6字节 4字节 6字节 4字节。[ 硬件类型 ][ 协议类型 ][ 硬件地址长度 ][ 协议地址长度 ][ OP ][ 发送方MAC ][ 发送方IP ][ 目标MAC ][ 目标IP ]请告诉我你的 MAC 地址"[ 目的MAC地址 ][ 源MAC地址 ][ 类型 ][ 数据 ][ CRC ]被 MAC 帧封装时,MAC 报头的目标地址就是请求方的 MAC。

2026-03-18 16:16:05 427

原创 【读书笔记】Effective C++ 条款7:为多态基类声明 virtual 析构函数

纯虚析构函数可以且应该public:shape() {}// 声明为纯虚// 提供定义(必须在类外)shape::~shape() {} // 空实现即可完整示例public:shape() {}// 纯虚析构函数shape::~shape() {} // 必须提供定义public:int _area;// shape s;// 错误:抽象类,不能实例化// 正确:派生类可以实例化delete ps;// 正确:调用 circle 析构,然后调用 shape 析构。

2026-03-17 16:01:37 383

原创 【网络】7.网络层:IP 协议详解

公网 IP 可以根据地区向对应机构申请获得,IP 的前 8 位(A 类网络)表示一个地区。第 3 位:MF(More Fragments)- 更多分片,最后一片为 0,其它为 1。IPv4 地址总量约为 43 亿,如果每个设备都有一个公网 IP,显然不够用。每经过一个路由器,路由器将自己的 WAN 口 IP 替换到源 IP 字段。网络是几十年发展的产物,是经历几十年建设的,并且是很早就被设计过的。有的路由器 WAN 口连接到公网 IP,就是公网出入口路由器。

2026-03-17 12:32:49 400

原创 【网络】6.UDP和TCP原理

机制作用校验和检测数据是否损坏序列号按序交付、去重确认应答确认数据已收到超时重传处理丢包连接管理三次握手、四次挥手流量控制防止接收方被淹没拥塞控制防止网络被淹没。

2026-03-15 11:30:20 432

原创 【读书笔记】Effective C++ 条款5~6:若不想使用编译器自动生成的函数,就该明确拒绝

public:private:// 只声明不定义,阻止编译器自动生成double _s;说明每套房子都是唯一的,因此不允许拷贝将拷贝构造函数和拷贝赋值运算符声明为private,阻止了外部调用只声明不定义:如果成员函数或友元试图调用,会得到链接错误public:nocopy() {} // 允许构造和析构private:// 只声明不定义。

2026-03-13 22:05:58 241

原创 【读书笔记】Effective C++ 条款4:确定对象被使用前已先被初始化

如果。

2026-03-11 18:57:19 408

原创 【网络】5.HTTP 协议详解与实现

浏览器是流量的入口,各家浏览器有自己的技术特点,因此需要统一的标准。当没有人获取文件时,资源就在服务器内部。由于 HTTP 协议固定有空行分隔,服务器可以拆分出多个报头,连续读到多个报文。:长短连接不是 HTTP 协议做的,而是由服务器和底层的 TCP 协议决定。等是 HTTP 协议的特殊字符,如果直接放在 URL 中会导致解析错误。HTTP 是无状态的,但网站只需要登录一次就能持续使用,这靠。:服务器需要服务不同版本的客户端,因此需要版本号来兼容。添加这行代码后,浏览器会存储对应的 Cookie。

2026-03-10 20:30:42 382 1

原创 【网络】4.自定义协议网络计算器

消息长度]\r\n[消息内容]\r\n。

2026-03-06 12:54:02 392

原创 【网络】3.TCP 基础网络聊天

父进程需要等待子进程结束,否则子进程会变成僵尸进程。子子进程成为孤儿进程,由 init 进程(PID 1)收养,自动回收。会阻塞,只能处理一个客户端,直到该客户端退出才能接受下一个连接。:用户不退出,线程/进程也不退出,一直处理该用户的请求(如聊天室):将套接字设置为监听模式,开始从内核接收发往该端口的连接请求。长服务:每个客户端独立占用一个线程/进程,线程池的优势不明显。:从已完成连接队列中取出连接,并返回用于通信的新套接字。:不合适,因为父进程大部分时间阻塞在。返回的新的套接字,而不是监听套接字。

2026-03-02 18:53:35 514

原创 【网络】2.UDP 基础网络聊天室

之前客户端程序的问题是:只有先发送消息,才能接收回复(阻塞在发送或接收)。可以使用两个线程,一个负责发送,一个负责接收。首次发送消息时,操作系统会自动为客户端绑定一个随机的 IP 和端口(防止端口冲突),因此客户端通常不需要显式调用。用户信息数组可能被多个线程同时访问:一个线程在遍历并群发消息时,另一个线程可能因为用户退出而删除用户。时绑定了特定的 IP 地址,服务端只能监听发送到该 IP 的消息。是一个宏,值为 0,表示绑定到所有网卡上的 IP。结构体:表示套接字地址,存储 IP 和端口信息。

2026-03-01 13:40:48 661

原创 【操作系统】4.Linux 操作系统与进程管理详解

进程获得 CPU 资源的先后顺序。为什么需要优先级?CPU 资源是稀缺的,需要通过优先级来确认执行顺序,确保多任务的有序进行。

2026-03-01 13:37:02 640

原创 【网络】1.网络基础与 Socket 编程

再次加上新的 MAC 报头(源 MAC:路由器出口的 MAC,目标 MAC:下一跳设备或最终主机的 MAC)。操作系统(大多用 C 语言编写)中,网络部分的代码都遵循统一标准,因此都能正确解析收到的数据。:加上 IP 报头(源 IP:192.168.2.2,目标 IP:172.168.2.2)。:加上 MAC 报头(源 MAC:A 的 MAC,目标 MAC:路由器的 MAC)。进程(内存中的数据) -> 网卡 -> 网络,这个过程属于 I/O(输入输出)。:距离变远了,会带来各种问题:数据丢了怎么办?

2026-02-26 15:30:34 537

原创 【操作系统】12.Linux 多线程同步与互斥详解

运行结束的线程在竞争锁时有优势,可能一直由它运行。当线程 A 执行完两步后被切出,线程 B 执行,最后写回内存的数字可能被覆盖,导致数据不一致。:获取锁时,交换操作就是将线程的数据(0)交换到 CPU 的寄存器,同时将锁的值(1)取出来。但先唤醒后解锁,意味着被唤醒的线程一定拿不到锁(因为锁还在当前线程手中),只能再次阻塞等待锁。该线程持有锁,信号处理函数在同一线程中执行,再次申请锁,导致自己锁住自己(死锁)。因此,对于其他线程来说,持有锁的线程要么在运行,要么就绪,它独占临界区,这体现了。

2026-02-24 15:38:38 657 1

原创 【操作系统】11.Linux线程创建

创建一个进程,就会有对应的虚拟地址空间。将虚拟地址空间划分给不同的"执行流"操作,就是线程。

2026-02-15 16:31:07 599

原创 【QT】5.QWidget控件(3)

相比于QWidget,是一个更完整的窗口,提供了菜单栏、工具栏、状态栏、停靠窗口等标准布局组件。创建一个C++类,继承Qt的DialogDialog.hQ_OBJECTpublic:Dialog.cppQPushButton* b = new QPushButton("关闭");QLabel* l = new QLabel("告示");QPushButton* b = new QPushButton("按钮", m);

2026-02-11 17:15:27 590

原创 【操作系统】10.Linux信号机制详解

信号是一种事件异步通知的机制。类比:人听到闹钟醒来,闹钟声就是信号,反应就是醒来,闹钟和人异步不相干。特性进程在信号没产生时就应该知道怎么处理信号处理可以是编译时立即的,可以等到适当时间进程由设计者已经内置了默认的处理信号方式。

2026-02-11 14:44:03 656

原创 【操作系统】9.进程间通信(IPC)详解

但是由于锁要让其它进程看到,因此要被共享。在程序中,SystemV相关函数没有用系统调用,因为它开在共享区上,这个区可以让用户自己进行使用,不需要系统调用。为浅拷贝父进程,拷贝时,不需要将打开的文件粘贴一份,而是使用引用计数。如一个进程结束,信号量大于1,就让另一个进程访问,也算通讯。:管道在进程结束后不会自动关闭,因此下一次程序启动时,由于路径名和随机数是一样的,因此。因此,先关掉1号进程,1号管道文件引用计数还会为2,关不掉。创建一个文件接上2个位置,然后父进程关闭一个,子进程关闭另一个,做到读写。

2026-02-08 15:19:44 582 1

原创 【QT】4.QWidget控件(2)

QString("天") + QString(QString::number(s)) + QString("小时"));ui->label->setText(QString("间隔") + QString(QString::number(d)) +label->setText(QString("标签页") + QString::number(count + 1));可以修改父类的resizeevent的事件,构成多态,以修改窗口大小时会自动调整大小。:将照片拉伸铺满对应控件,这样,图片就能铺满窗口。

2026-02-06 18:58:57 681

原创 【操作系统】8.静态库与动态库解析

静态库:链接时直接将代码拷贝到可执行文件中。程序体积大,但部署简单,不依赖运行环境。动态库:链接时只记录依赖,运行时才加载和链接。程序体积小,库可被多个程序共享,但部署时需要确保库的存在和版本兼容。ELF 格式:是理解程序编译、链接、加载的关键。sections用于链接,segments用于加载。动态链接核心技术位置无关代码 (PIC):使库代码可以加载到任意地址。全局偏移表 (GOT):存储外部符号的运行时地址。延迟绑定:提高程序启动性能。程序的地址从编译时的逻辑地址,到链接时的虚拟地址布局。

2026-02-02 12:57:07 627 1

原创 【操作系统】7.ETX文件系统

Linux的目录也和文件一样属性存在inode table中,目录名字存在data blocks上,同时目录下的文件名字也存在这。打开对应文件就需要他的目录的内容区做出inode,名字映射表,以用名字就可以打开对应文件。同理,在路径里再新建路径,计数又会+1,因为子目录有..文件,就是当前目录的硬链接。同时,这个节点还存在链表,哈希中,可以通过其它形式快速找到,打开。在上面,可以用inode找到对应文件,但是inode不是跨分区的。原因:在路径里有一个.文件,就是路径的硬链接,inode值一样。

2026-01-31 09:59:27 623 1

原创 【操作系统】6.文件 I/O 与文件系统

解析命令:识别出命令中的重定向符号 (>>) 及其后面的文件名。执行重定向对于输出重定向 (或>>),根据模式打开文件,然后使用dup2将新文件的fd复制到1stdout对于输入重定向 (),打开文件,使用dup2将新文件的fd复制到0stdin记得关闭原fd。执行命令:重定向设置完成后,再执行原本的命令(此时命令的输入/输出已经指向了文件)。my_file。

2026-01-29 13:07:23 906 1

原创 【QT】3.QWidget控件

目录1. enabled:是否可用状态2. geometry:位置与大小3. windowFrame:窗口框架4. windowTitle:窗口标题5. windowIcon:窗口图标6. qrc 资源文件机制7. windowOpacity:窗口透明度8. cursor:修改光标9. font:字体相关10. toolTip:提示文本11. focusPolicy:焦点策略12. styleSheet:样式表(仿CSS的QSS)禁用状态:控件不接受用户输入(如点击)。一个父控件被禁用,其所有子控件也会被禁

2026-01-27 16:37:27 714

原创 【操作系统】5.进程控制和shell的实现(附代码)

操作系统会为修改者(子进程)重新开辟一块物理内存,拷贝数据,并修改其页表映射,最终完成写入。:由于子进程通常不会使用父进程的全部数据,对于不修改的部分,父子可以共享,无需额外占用内存。需要 Shell 进程(父进程)获取上一个命令的退出状态,这无法通过创建子进程来完成。在 Shell 主循环中,先判断是否为内建命令,如果是则直接执行,否则创建子进程执行。当子进程(或父进程)需要修改一个共享的变量时,虽然地址没问题,但权限不符,此时会触发。如果父进程不管子进程,子进程结束会变成僵尸进程,造成内存泄漏,即使。

2026-01-26 11:03:01 942

原创 【QT】2.QT 信号和槽

在widget.h的Widget在widget.cppthis->setWindowTitle("按钮点击");在widget.ui的图形编辑器界面中,右键点击按钮控件,选择“转到槽...”。​​​​​​​选择对应的信号(如clicked()),QT Creator 会自动在widget.h和widget.cpp中生成对应格式的槽函数。this->setWindowTitle("点击按钮");命名规则on_ + 控件对象名 + _ + 信号名。之后,无需手动编写connect语句即可生效。原理。

2026-01-22 18:27:34 880 1

原创 【QT】1.QT 基础入门

QT 内置的宏,展开后会生成一些代码,是 QT 信号和槽机制的核心所需。通常不需要手动修改,代表按钮的对象名(可以在界面右侧的属性编辑器中修改)。:是编写 QT 应用程序时必须的类,管理应用程序的控制流和主要设置。),在构造函数结束时它就会立即销毁,导致无法显示。文件(Formfile)密切相关,用于访问界面上的控件。不同,这是启动应用程序的事件循环,让程序运行起来。,打开图形化编辑器,可以从左侧拖拽控件到界面上。函数)时,坐标是相对于其父控件(父窗口)的,,然后在左上角的“文件”菜单中点击“新建”。

2026-01-19 17:39:15 1107 1

原创 【操作系统】3.开发工具

分别控制光标向左、下、上、右移动(很多命令都支持在前面加上数字,表示重复次数)。在 C 语言发展时,汇编转二进制的技术已经比较成熟,因此可以“站在巨人的肩膀上”。开始时,由于没有汇编语言,需要有直接用二进制编写的编译器来编译汇编语言的编译器。注意:一旦退出文件就无法撤销,但仅保存文件时操作历史还在,可以撤销。修改文件内容时,文件属性(如大小、最后修改时间)也会变,因此。可以看到,即使我们只有几行的代码,预处理后也可能变成近千行。因为它们是链接的基本单位,可以与库进行链接,最终形成可执行文件。

2026-01-18 12:08:38 924

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

在这个函数中,calc抛出异常,int数组就不会被析构,造成内存泄露。除非在每一个new后面都跟着一个。

2026-01-16 23:08:38 663

原创 【C++】2.9异常处理

抛出异常后,由于后面的程序不执行,函数栈帧会不断销毁,直到找到最近的可接受该异常的处理代码。可能与实际异常捕获冲突,且编译器不会严格检查,因此要避免写这种有冲突的代码。允许常量转为非常量;可以捕获任何类型的异常,作为程序的兜底,防止因为异常找不到匹配的。是虚函数,因此不同的子类在通过基类引用捕获时,可以调用子类重写的。在抛出异常后,后面的代码不再执行,可能导致内存释放不会进行。异常抛出后,沿着调用链,在里层或外层都能被处理。同时,其它模块也可以继承基类,抛出对应的异常。类型,不匹配,因此继续向下抛出,到。

2026-01-14 22:02:23 328 1

原创 【C++】2.8C++11特性

左值引用和右值引用的共同目的都是减少拷贝,提高效率。左值引用还能修改参数和返回值,方便使用(如。

2026-01-13 14:13:37 988 6

原创 【C++】2.7 哈希表及其实现(附代码)

int _year;int _month;int _day;return has;因此,哈希表做key的要求:能转为整型,可以有不等于的比较:_kv(kv){ }为什么单链表:单链表对于哈希表已经足够了,还可节省空间为什么不用list或forward_list因为在扩容时,用std的list会自动析构,但是我们其实可以回收利用原先的节点,节省开销。

2026-01-05 20:25:28 974 10

空空如也

空空如也

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

TA关注的人

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