繁体   English   中英

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

[英]weak_ptr - Dereferencing - Throw if expired

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

接着 :

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

谢谢。

使用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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM