欢迎来到我的博客
我的博客正式上线。 这里会记录技术学习、项目实践和阅读笔记。 接下来会持续完善这个博客。
我的博客正式上线。 这里会记录技术学习、项目实践和阅读笔记。 接下来会持续完善这个博客。
weak_ptr 当两个对象互相持有对方的shared_ptr时它们的引用计数永远不会归零,weak_ptr就是为了解决问题而生的,它是一种不参与引用计数的观察者指针,可以通过它来查看对象是否还活着,如果活着就临时获取一个shared_ptr来访问,但它本身不会延长对象的生命周期。 weak_ptr的API lock() lock()尝试获取一个指向对象的shared_ptr,如果对...
共享所有权 shared_ptr表达的是共享所有权的语义,多个shared_ptr可以指向同一个对象,它们共同决定对象的生命周期。只有当最后一个shared_ptr被销毁时,对象才会被delete。 但是共享所有权不是免费的,每个shared_ptr的拷贝和析构都需要更新引用计数,而且引用计数必须是线程安全的(原子操作)。此外shared_ptr内部还维护了一个控制块来存储引用计数和其它...
独占所有权 unique_ptr最核心的语义是独占,这意味着在同一时刻,只有一个unique_ptr拥有对象的所有权,不能进行拷贝构造和拷贝赋值,只允许移动。 make_unique(C++14) C++11引入了unique_ptr但是没有提供make_unique,所以C++14之前我们只能先new一块空间,再构造unique_ptr。如果我们在这两个步骤中间不幸抛出了异常,那么资...
分配给套接字的IP地址与端口号 IP是网络协议的简写,IP协议规定了数据包的格式,地址怎么编码、怎么寻址、怎么路由转发。为了收发网络数据我们需要按照IP协议来给计算机分配一个值(IP地址)。端口号是为了区分程序中创建的套接字而分配给套接字的编号(从操作系统的视角来看,端口号是分配给进程的,端口最终被某个进程占用,进程通过套接字持有)。 IP地址 IP地址分为两类: IPv4 :...
TCP/IP协议栈 TCP/IP协议栈分为4层: graph TD A["应用层"] -->| | B["TCP层"] A -->| | C["UDP层"] B -->| | D["IP层"] C -->| | D D -->| | E["链路层"] style A fill:#333,stroke:#fff...
创建套接字 socket 不是”应用层与传输层之间”的接口,而是”应用层与整个网络协议栈(传输层 + 网络层)之间”的接口。 ┌──────────────────────────────┐ │ 应用层 你的程序 │ │ │ │ ↕ socket API │ ← 接...
std::thread基础 std::thread构造 std::thread的构造函数接受一个可调用对象以及可选的参数列表,可以通过三种方式构造: 函数指针 Lambda表达式 函数对象 最常用的就是通过函数指针和Lambda表达式进行构造。 #include <thread> #include <iostream> #include &l...
并发思维与基础 并发与并行的区别 并发是一种程序的组织方式:把一个复杂的问题拆成多个独立、可以交替推进的子任务,然后用某种机制(线程、协程、事件循环)来管理它们的执行顺序。 并发不要求多个CPU核心,在单核机器上也可以通过操作系统的时间片轮转让多个线程交替使用CPU。 并行则是指多个操作真正在同一时间物理上同时执行,这需要多核CPU、多处理器或GPU等硬件支持。 在C++内,我们用s...
CS225 堆:二叉堆、优先队列与数组实现 本文对应 CS225 Spring 2026 Lecture 21 的 Heaps、Lecture 22 的 Heaps Analysis,并连接配套 lab_heaps。主线是:为什么需要堆、完全二叉树如何用数组表示、heap property 如何维护、如何实现优先队列,以及这些操作的复杂度。 课程资料与学习路线 官方资料: ...