首页 > 解决方案 > 将 std::weak_ptr 传递给函数有用吗?

问题描述

我正在阅读Herb Sutter 的这篇关于将智能指针传递给函数的文章。他没有提到std::weak_ptr,老实说,我找不到传递这种智能指针有用的好场景。

该功能是否具有所有权?通过std::shared_ptr。该函数是否只需要对底层对象进行操作?传递原始指针或引用。

那么传递std::weak_ptr给函数 100% 没用吗?

标签: c++c++11smart-pointers

解决方案


那么传递std::weak_ptr给函数 100% 没用吗?

不。

考虑这个玩具示例。

struct PointerObserver
{
    std::weak_ptr<int> held_pointer;

    void observe( std::weak_ptr<int> p )
    {
        held_pointer = std::move(p);
    }

    void report() const
    {
        if ( auto sp = held_pointer.lock() )
        {
            std::cout << "Pointer points to " << *sp << "\n";
        }
        else
        {
            std::cout << "Pointer has expired.\n";
        }
    }
};

在此示例中,成员函数observe保留weak_ptr传递给它的值。这通常被称为“接收器参数”。

weak_ptr参数表示此传递的指针不属于自己,但保留稍后拥有的能力,安全地检测指针是否已过期。

作为一个不同的例子,一个为以后保持状态的函数也可以在多线程上下文中有用地接收一个weak_ptr参数,其中相关数据可能 在函数工作时过期。


推荐阅读