C++ — 避免常见 C++ 错误
C++
简介
此技能提供 C++ 指南,帮助开发者避免常见错误,如内存泄漏、悬垂引用、未定义行为和所有权混淆。包含 C++ 最佳实践和参考文档。
技能文档
---
name: C++
slug: cpp
version: 1.0.1
description: 编写安全的 C++ 代码,避免内存泄漏、悬空指针、未定义行为和所有权混淆。
metadata: {"clawdbot":{"emoji":"⚡","requires":{"bins":["g++"]},"os":["linux","darwin","win32"]}}
---
## 快速参考
| 主题 | 文件 |
|-------|------|
| RAII、智能指针、new/delete | `memory.md` |
| 裸指针、引用、nullptr | `pointers.md` |
| 三/五/零法则、继承、虚函数 | `classes.md` |
| 容器、迭代器、算法 | `stl.md` |
| 模板、SFINAE、concepts | `templates.md` |
| 线程、互斥锁、原子操作 | `concurrency.md` |
| C++11/14/17/20、移动语义 | `modern.md` |
| 未定义行为陷阱 | `ub.md` |
## 关键规则
- 裸 `new` 没有 `delete` 会导致泄漏 — 使用 `std::unique_ptr` 或 `std::make_unique`
- 返回局部变量的引用 — 未定义行为,对象在返回时被销毁
- C 字符串使用 `==` 比较的是指针 — 使用 `std::string` 或 `strcmp()`
- 有符号整数溢出是未定义行为 — 不像无符号那样回绕
- 基类需要虚析构函数 — 否则派生类析构函数会被跳过
- `std::move` 不会实际移动 — 它只是转换为右值引用,启用移动语义
- 被移动后的对象处于有效但未指定状态 — 重新赋值前不要使用
- 非原子操作上的数据竞争是未定义行为 — 使用 `std::mutex` 或 `std::atomic`
- `vector` 不是真正的容器 — 返回代理对象,使用 `deque`
- `map[key]` 会在键不存在时插入默认值 — 使用 `find()` 或 `contains()` 检查
- 花括号初始化 `{}` 防止窄化转换 — `int x{3.5}` 报错,`int x(3.5)` 截断
- `push_back` 可能使迭代器失效 — vector 可能重新分配内存
- `string_view` 不拥有数据 — 底层字符串必须比视图存活更久
安装命令
clawhub install cpp