Google 用了很多自己实现的技巧 / 工具使 C++ 代码更加健壮, 我们使用 C++ 的方式可能和你在其它地方见到的有所不同.
> 总述
动态分配出的对象最好有单一且固定的所有主, 并通过智能指针传递所有权.
> 定义
所有权是一种登记/管理动态内存和其它资源的技术. 动态分配对象的所有主是一个对象或函数, 后者负责确保当前者无用时就自动销毁前者. 所有权有时可以共享, 此时就由最后一个所有主来负责销毁它. 甚至也可以不用共享, 在代码中直接把所有权传递给其它对象.
智能指针是一个通过重载 *
和 ->
运算符以表现得如指针一样的类.
智能指针类型被用来自动化所有权的登记工作, 来确保执行销毁义务到位.
std::unique_ptr
是 C++11 新推出的一种智能指针类型,
用来表示动态分配出的对象的独一无二的所有权; 当 std::unique_ptr
离开作用域时, 对象就会被销毁. std::unique_ptr
不能被复制,
但可以把它移动(move)给新所有主.
std::shared_ptr
同样表示动态分配对象的所有权, 但可以被共享, 也可以被复制;
对象的所有权由所有复制者共同拥有, 最后一个复制者被销毁时,
对象也会随着被销毁.
> 优点
> 缺点
std::unique_ptr
的所有权传递原理是 C++11 的 move 语法,
后者毕竟是刚刚推出的, 容易迷惑程序员.> 结论
如果必须使用动态分配, 那么更倾向于将所有权保持在分配者手中.
如果其他地方要使用这个对象, 最好传递它的拷贝,
或者传递一个不用改变所有权的指针或引用. 倾向于使用 std::unique_ptr
来明确所有权传递, 例如:
std::unique_ptr<Foo> FooFactory();
void FooConsumer(std::unique_ptr<Foo> ptr);
如果没有很好的理由, 则不要使用共享所有权.
这里的理由可以是为了避免开销昂贵的拷贝操作, 但是只有当性能提升非常明显,
并且操作的对象是不可变的(比如说 std::shared_ptr<const Foo>
)时候,
才能这么做. 如果确实要使用共享所有权, 建议于使用 std::shared_ptr
.
不要使用 std::auto_ptr
, 使用 std::unique_ptr
代替它.
> 总述
使用 cpplint.py
检查风格错误.
> 说明
cpplint.py
是一个用来分析源文件, 能检查出多种风格错误的工具.
它不并完美, 甚至还会漏报和误报, 但它仍然是一个非常有用的工具. 在行尾加
// NOLINT
, 或在上一行加 // NOLINTNEXTLINE
, 可以忽略报错.
某些项目会指导你如何使用他们的项目工具运行 cpplint.py
.
如果你参与的项目没有提供, 你可以单独下载
cpplint.py.
scoped_ptr
和 auto_ptr
已过时. 现在是 shared_ptr
和
uniqued_ptr
的天下了.