weak_ptr - 解除引用 - 如果过期则抛出

时间:2016-09-23 14:19:37

标签: c++ pointers exception weak-ptr

取消引用weak_ptr不会自动检查指针是否已过期。为什么这样设计?

我想安全地取消引用弱指针,而不必先使用expired()检查它们,如果它们为空则抛出异常。

这是一个很好的做法吗?这样做的正确方法是什么?我应该重载*->运算符,以便它们首先执行此检查吗?我应该写一个免费的功能吗?

类似的东西:

template< typename T >
weak_ptr< T > & check( weak_ptr< T > & p )
{
    if( p.expired() )
        throw logic_error( "Trying to dereference a null pointer." );
    return p;
}

然后:

weak_ptr< int > pi;
int i = *check( pi );

谢谢。

1 个答案:

答案 0 :(得分:6)

使用expired()没有用,因为它会在多线程程序中引入比赛。另外一个例外并不好,因为weak_ptr过期并不是那么特别:它们的设计正是为了这个。

围绕weak_ptr的好处是它们不能解除引用。相反,要访问您调用lock()的对象,该对象以原子方式返回指向该对象的shared_ptr,如果不可用则返回null

访问弱指针的常规方法是:

void safe_do(weak_ptr<T> &w)
{
    shared_ptr<T> p = w.lock();
    if (p)
        p->do();
}

如果您真的想要例外,可以使用以下变体:

void safe_do2(weak_ptr<T> &w)
{
    shared_ptr<T>(w)->do(); //throws a bad_weak_ptr if w expired
}