gpt4 book ai didi

c++ - weak_ptr - 取消引用 - 如果过期则抛出

转载 作者:太空宇宙 更新时间:2023-11-03 10:40:26 27 4
gpt4 key购买 nike

取消引用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com