Vir*_*721 1 c++ pointers exception weak-ptr
取消引用a 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;
}
Run Code Online (Sandbox Code Playgroud)
然后 :
weak_ptr< int > pi;
int i = *check( pi );
Run Code Online (Sandbox Code Playgroud)
谢谢.
使用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();
}
Run Code Online (Sandbox Code Playgroud)
如果您真的想要例外,可以使用以下变体:
void safe_do2(weak_ptr<T> &w)
{
shared_ptr<T>(w)->do(); //throws a bad_weak_ptr if w expired
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1548 次 |
| 最近记录: |