取消引用 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()
没有用,因为它会在多线程程序中引入竞争。异常(exception)也不是很好,因为让 weak_ptr
过期并不是什么异常(exception):它们正是为此而设计的。
围绕 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
}
关于c++ - weak_ptr - 取消引用 - 如果过期则抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39663103/