31 August 2022

C++ 核心指南目录

C.32: If a class has a raw pointer (T*) or reference (T&), consider whether it might be owning

理由

很多代码里的所有权信息是不明确的。

例子

class legacy_class
{
    foo* m_owning;   // Bad: change to unique_ptr<T> or owner<T*>
    bar* m_observer; // OK: keep
}

这里,m_owning成员变量是由legacy_class类所有的,所以要改成 unique_ptr<T>owner<T*>。而m_observer则是引用了外部的变量,所以可以保留这么写。

注意

在新写的代码里,明确表明哪些指针是类所有,哪些指针是类外面的变量。类不能保有引用的所有权。

强化

查看原始成员指针和成员引用,是否初始化的时候分配了内存。