现代 C++ 实战(05):智能指针(下)——模式与循环引用
上一篇我们掌握了 unique_ptr 和 shared_ptr 的基本用法。但在真实项目里,智能指针不只是替代 new/delete——循环引用、工厂函数、Pimpl、Observer 等场景会逼你思考「谁该拥有、谁该观察」。 这一篇是智能指针的下半场:weak_ptr 如何打破循环引用,以及几种经典设计模式如何用智能指针落地。 这是「现代 C++ 实战」系列的第 5 篇。对应 demo:ref/cpp_demo/smart_pointers/ 第 05–09 节。建议先读 第 04 篇:智能指针(上)。 一、weak_ptr 与循环引用shared_ptr 的引用计数是双向的:A 持有 B,B 也持有 A 时,计数永远不归零——内存泄漏。 12345struct Node { std::shared_ptr<Node> next; // std::shared_ptr<Node> parent; // 危险:与子节点形成环 std::weak_ptr<Node> parent; // 安...
现代 C++ 实战(04):智能指针(上)——所有权与 RAII
上一篇我们搞懂了移动语义——资源可以在对象之间「搬家」。但还有一个更根本的问题:这块内存到底谁负责释放? C++ 没有垃圾回收,手动 new / delete 一旦配对出错,就是泄漏或 double-free。 现代 C++ 的答案是 RAII + 智能指针:把所有权写进类型系统,让编译器和析构函数帮你收尾。这一篇聚焦 unique_ptr 与 shared_ptr 的上半场——独占 vs 共享、什么时候该用谁、以及 make_unique / make_shared 为什么更推荐。 这是「现代 C++ 实战」系列的第 4 篇。对应 demo:ref/cpp_demo/smart_pointers/ 第 01–04 节。建议先读 第 03 篇:移动语义与右值引用。 一、RAII:资源获取即初始化RAII(Resource Acquisition Is Initialization) 是 C++ 资源管理的核心惯用法: 阶段 做什么 构造 获取资源(内存、文件句柄、锁……) 使用 通过对象访问资源 析构 自动释放资源——无论正常返回还...
现代 C++ 实战(03):移动语义与右值引用
上一篇我们把 C++ 版本地图铺好了。C++11 里有一项改动,几乎改变了整个语言写高性能代码的方式:移动语义(Move Semantics)。很多人第一次遇到 std::move 和 T&& 时会困惑:「这到底是在拷贝还是在移动?」 这一篇我们拆开来看:左值 / 右值是什么、std::move 做了什么、移动构造如何省掉深拷贝,并带你跑 right_ref_demo demo。 这是「现代 C++ 实战」系列的第 3 篇。对应 demo:ref/cpp_demo/basics/right_ref_demo/。建议先读 第 02 篇:C++ 版本演进一览。 一、为什么需要移动语义?想象你在搬家:把书从旧书架搬到新书架,有两种做法: 做法 类比 C++ 中的对应 复印 把每本书复印一份放到新家,旧家原件还在 拷贝构造——两份独立数据 直接搬 把书整箱抬走,旧书架空了 移动构造——资源所有权转移 对 std::string、std::vector 这类在堆上持有大块内存的类型,深拷贝意味着: 分配同等大小的新内存 逐字节复制内容...
现代 C++ 实战(02):C++ 版本演进一览
上一篇我们搞定了 CMake 构建。但在写代码之前,还有一个「地图」问题:C++ 到底演进了哪些版本?每个版本加了什么? 如果你还在用 C++98 的思维读 C++20 的代码,很容易觉得「语法怎么又变了」。 这一篇不深入任何单一特性,而是把 C++03 → C++26 的演进脉络梳理清楚,并带你跑一遍 version_features demo——后面 25 篇特性文章,都可以在这张地图上找到位置。 这是「现代 C++ 实战」系列的第 2 篇。对应 demo:ref/cpp_demo/basics/version_features/。建议先读 第 01 篇:CMake 与现代构建。 一、C++ 标准时间线C++ 不像 Python 那样每年一个大版本,而是 3~5 年发布一次国际标准(由 ISO 委员会制定)。对开发者来说,真正重要的是:编译器支持到了哪个 -std=。 标准 发布年份 __cplusplus 宏 常用编译 flag 定位 C++98 / C++03 1998 / 2003 199711L -std=c++03 经典 C+...
现代 C++ 实战(01):CMake 与现代构建
上一篇我们把环境跑通了。从这一篇开始,我们真正进入 C++ 工程的地基:CMake。本系列 39 个 demo 全部用 CMake 构建,其中 projects/fetch_content/ 是一个「集大成」示例——它用 FetchContent 自动拉取 gtest、json、fmt、spdlog 等 6 个第三方库,演示现代 C++ 项目最常见的依赖管理方式。 搞懂这篇,后面所有带外部库的 demo 你都不会慌。 这是「现代 C++ 实战」系列的第 1 篇。对应 demo:ref/cpp_demo/projects/fetch_content/。建议先读 第 00 篇:环境搭建与项目导览。 一、为什么需要 CMake?手写 Makefile 在小项目里够用,但现代 C++ 项目很快会遇到天花板: 痛点 Makefile 的局限 CMake 的做法 跨平台 Windows / macOS / Linux 语法不同 一套 CMakeLists.txt,生成对应平台的构建文件 依赖管理 手动下载、编译、写 -I / -L Fet...
现代 C++ 实战(00):环境搭建与项目导览
学现代 C++,最怕的不是语法多,而是 demo 跑不起来、编译器版本对不上、CMake 报错看不懂。这一篇我们不讲任何语言特性,只把「能编译、能运行、知道 39 个 demo 在哪」这件事搞定。后面 27 篇会在这个环境里,逐个拆解 C++11 到 C++23 的核心特性。 这是「现代 C++ 实战」系列的第 0 篇。本系列基于 ref/cpp_demo 的 39 个独立 CMake 项目,在 Docker 或 macOS 本地编译运行。下一篇我们从 CMake 与现代构建说起,搞懂 FetchContent 依赖管理。 一、为什么这样学?你可能已经会写 C++,但面对 C++11 之后的「现代 C++」,往往有这样的困惑:特性太多、标准迭代太快、书和博客各说各话。本系列的选择很克制: 选择 原因 Demo 驱动 每个知识点对应可编译、可运行的代码,不是纸上谈兵 39 个独立项目 每个子目录自包含,可单独拷贝到其他机器 统一 build.sh 所有 demo 同一套构建命令,降低切换成本 Docker + macOS 双环境 容器保证 Linux...
测试文章-Hello-2026
🎉 欢迎来到 2026 年!这是一篇测试文章,用于验证 Hexo 博客系统是否正常工作。 文章特点 ✅ 支持 Markdown 语法 ✅ 支持 Emoji 表情 ✅ 支持代码高亮 代码示例下面是一段 JavaScript 代码: 12345function greet(name) { console.log(`Hello, ${name}! Welcome to 2026!`);}greet('World'); 引用 学习是一种终身的事业。—— 某位智者 列表无序列表 第一项 第二项 第三项 有序列表 首先 然后 最后 表格 项目 描述 Hexo 静态博客框架 Butterfly 主题模板 GitHub Pages 托管服务 感谢阅读!🚀
A good start for Dockerfile
构建 Docker 镜像,这样开发调试都是与真实线上环境一致。 123456789# 查看所有镜像docker images# 从 Dockerfile 中构建一个镜像,并保存为 ubuntu:22.04,注意,「.」表示配置文件在当前目录docker build -t ubuntu:22.04 .# 启动镜像,一般会写成一个 shell 脚本docker run -it --rm -v /sacode:/worksapce 123456789101112131415161718192021222324252627282930313233343536# 基础镜像FROM ubuntu:22.04# 设置环境变量ENV DEBIAN_FRONTEND=noninteractive# 更新软件源并安装基础工具RUN apt-get update && apt-get install --no-install-recommends -y \ build-essential \ cmake \ gdb \ clang \ lldb \ ...
Read mail
当收到邮件时,终端会在登录后显示:”You have mail.”。 这时,可以使用 mail 命令阅读邮件: 12345678// 读信mail -N// 删除d *// 退出quit
Crontab 定时任务
crontab -e crontab -l */30 * * * * ps -ef | grep debugserver | xargs kill 每 30 分钟 kill hang 掉的进程















