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

标签 c++ pointers exception weak-ptr

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

相关文章:

c++ - 是否存在占用 0 个字节的 C++ 类型

Android,获取指向 ParseObject 的指针

c++ - 使用 boost::filesystem 时如何正确处理错误?

Java JNI : How to set String [ ] field Of Java class from native method of C++

c++ - 带有 boost 文件系统 directory_iterator 的 Microsoft PPL parallel_for_each

c - 简单赋值中的段错误

c - 链表遍历**while(thead != NULL)**和while(thead->next !=NULL)的区别

java - 转换为对象数组时出现 ClassCastException

java - 尝试填充 float 组时出现 ArrayStoreException

c++ - 执行系统命令很慢