【发布时间】:2013-07-06 09:08:56
【问题描述】:
在 C++11 中,您可以使用 shared_ptr<> 与对象或变量建立所有权关系,并使用 weak_ptr<> 以非拥有方式安全地引用该对象。
您还可以使用unique_ptr<> 与对象或变量建立所有权关系。但是,如果其他非拥有对象也想引用该对象怎么办? weak_ptr<> 在这种情况下没有帮助。原始指针很有帮助,但也带来了各种缺点(例如,它们可以是 automatically initialized to nullptr,但这是通过与 std::*_ptr<> 类型不一致的技术来实现的)。
对于通过unique_ptr<> 拥有的对象的非拥有引用,weak_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++ 中,它是为未来提出的,还是在例如另一个广泛可用的实现中?提升?
【问题讨论】:
-
unique_ptr::get如果你想访问底层指针。没有weak_ptr等价物,因为那样unique_ptr就不会很独特 -
没有类似的东西,因为
unique_ptr被设计为对原始指针没有开销。如果它必须保留所有弱指针的引用计数,那将是不可能的。 -
@Xeo,这很公平。
unique_ptr的weak_ptr等价物可能成本过高。但是可能没有某种中间功能:一种在语法上类似于其他现代指针类型的指针类型,在构造时自动取消,防止直接调用删除等,但没有额外的开销?这些可能仍会受到悬空指针问题的影响,但不会比原始指针更差,而且确实比原始指针更好。有没有这样的类型存在? -
@OldPeculier 您混淆了所有权语义。
unique_ptr是一个拥有指针。如果您想要其他人可以拥有非拥有引用的指针,请使用shared_ptr。介于两者之间的另一个智能指针有什么用途? -
您的“Duh. Oops. Dumb error”不是很有说服力。您不应该在所有权句柄之外使用
delete(另请参阅:Rule of Zero)。防止这样的错误是防止马基雅维利,而不是墨菲。
标签: c++ c++11 unique-ptr