weak_ptr - 取消引用 - 如果过期则抛出

weak_ptr - Dereferencing - Throw if expired

取消引用 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 );

谢谢。

使用expired()没有用,因为它会在多线程程序中引入竞争。例外也不是很好,因为 weak_ptr 过期并不是什么例外:它们正是为此而设计的。

weak_ptr 的妙处在于它们不可取消引用。相反,要访问您调用 lock() 的对象,原子地 returns 一个指向该对象的 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
}