取消引用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 );
谢谢。
答案 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
}