weak_ptr - 取消引用 - 如果过期则抛出
weak_ptr - Dereferencing - Throw if expired
取消引用 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()
没有用,因为它会在多线程程序中引入竞争。例外也不是很好,因为 weak_ptr
过期并不是什么例外:它们正是为此而设计的。
weak_ptr
的妙处在于它们不可取消引用。相反,要访问您调用 lock()
的对象,原子地 returns 一个指向该对象的 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
}
取消引用 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()
没有用,因为它会在多线程程序中引入竞争。例外也不是很好,因为 weak_ptr
过期并不是什么例外:它们正是为此而设计的。
weak_ptr
的妙处在于它们不可取消引用。相反,要访问您调用 lock()
的对象,原子地 returns 一个指向该对象的 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
}