5.1. 所有权与智能指针
1. 总述:
- 动态分配的对象最好有单一且固定的所有主,并通过智能指针传递所有权。
2. 定义:
-所有权是一种登记/管理动态内存和其它资源的技术
- 所有权是管理动态内存和其他资源的技术,涉及对象或函数负责在不再使用时销毁对象。
- 智能指针通过重载`*`和`->`运算符来自动化所有权登记工作。
3. 智能指针类型:
- `std::unique_ptr`:表示独一无二的所有权,不可复制,可移动。
- `std::shared_ptr`:表示可共享的所有权,可复制,对象在最后一个所有者销毁时被销毁。
4. 优点:
- 清晰的所有权安排有助于管理动态分配的内存。
-传递对象的所有权, 开销比复制来得小, 如果可以复制的话。
- 简化了对象生命周期的协调工作。
- 提高了代码的可读性。
- 简化了代码,减少了错误。
- 对于`const`对象,智能指针比深度复制更高效。
5. 缺点:
- 指针语义比值语义复杂,特别是在API中。
- 值语义的开销常被高估,所有权传递的性能提升可能不足以弥补可读性和复杂度的损失。
- API若依赖所有权传递,可能限制客户端的内存管理模型。
- 智能指针使资源释放位置不明显。
- `std::unique_ptr`的move语法可能迷惑程序员。
- 引入共享所有权可能需要系统重构。
- 共享所有权的运行时登记可能有较大开销。
- 极端情况下(如循环引用)共享所有权的对象可能永不销毁。
- 智能指针不能完全代替原生指针。
6. 结论:
- 倾向于保持所有权在分配者手中,通过拷贝或非所有权改变的指针/引用传递。
- 倾向于使用`std::unique_ptr`明确所有权传递。
- 避免使用共享所有权,除非避免昂贵的拷贝操作且对象不可变。
- 如果使用共享所有权,建议使用`std::shared_ptr`。
- 不要使用`std::auto_ptr`,而应使用`std::unique_ptr`代替。
scoped_ptr
和 auto_ptr
已过时. 现在是 shared_ptr
和 unique_ptr
的天下。
5.2. Cpplint
> 总述
使用 cpplint.py
检查风格错误.
> 说明
cpplint.py
是一个用来分析源文件, 能检查出多种风格错误的工具. 它不并完美, 甚至还会漏报和误报, 但它仍然是一个非常有用的工具. 在行尾加 // NOLINT
, 或在上一行加 // NOLINTNEXTLINE
, 可以忽略报错.
某些项目会指导你如何使用他们的项目工具运行 cpplint.py
. 如果你参与的项目没有提供, 你可以单独下载 cpplint.py。