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

Vir*_*721 1 c++ pointers exception weak-ptr

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

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

这是一个很好的做法,这是一个正确的方法吗?我应该超载*->操作员,以便他们先执行此检查吗?我应该写一个免费的功能吗?

就像是 :

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;
}
Run Code Online (Sandbox Code Playgroud)

然后 :

weak_ptr< int > pi;
int i = *check( pi );
Run Code Online (Sandbox Code Playgroud)

谢谢.

rod*_*igo 7

使用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();
}
Run Code Online (Sandbox Code Playgroud)

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

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