[英]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.