在 C++11 中,您可以使用 ashared_ptr<>
与对象或变量建立所有权关系,并weak_ptr<>
以非拥有方式安全地引用该对象。
您还可以使用它unique_ptr<>
来建立与对象或变量的所有权关系。但是,如果其他非拥有对象也想引用该对象怎么办?weak_ptr<>
在这种情况下没有帮助。原始指针很有帮助,但也带来了各种缺点(例如,它们可以自动初始化为 nullptr,但这是通过与类型不一致的技术来实现的std::*_ptr<>
)。
weak_ptr<>
对 via 拥有的对象的非拥有引用等价于unique_ptr<>
什么?
这是一个清晰的示例,类似于我正在开发的游戏中的某些内容。
class World
{
public:
Trebuchet* trebuchet() const { return m_trebuchet.get(); }
private:
std::unique_ptr< Trebuchet > m_trebuchet;
};
class Victim
{
public:
Victim( Trebuchet* theTrebuchet ) : m_trebuchet( theTrebuchet ) {}
~Victim()
{
delete m_trebuchet; // Duh. Oops. Dumb error. Nice if the compiler helped prevent this.
}
private:
Trebuchet* m_trebuchet; // Non-owning.
};
shared_ptr< Victim > createVictim( World& world )
{
return make_shared< Victim >( world.trebuchet() );
}
在这里,我们使用原始指针来维护与通过其他地方拥有的对象的非拥有关系unique_ptr<>
。但是,我们能做到最好吗?
希望是一种指针,它:
- 看起来像其他现代指针类型。例如
std::raw_ptr<T>
。 - 替换原始指针,以便整个使用现代指针类型的代码库可以通过搜索(大致)找到所有指针。
_ptr<
- 自动初始化为 nullptr。
因此:
int* p; // Unknown value.
std::raw_ptr< int > p; // null.
这种类型现在是否已经存在于 C++ 中,是为未来提出的,还是在例如 Boost 中广泛可用的另一种实现?