c++ - 将 std::weak_ptr 传递给函数有用吗?

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

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

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

那么将 std::weak_ptr 传递给函数是否 100% 没用?

最佳答案

So is passing std::weak_ptr to functions 100% useless?

没有。

考虑这个玩具示例。

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参数,其中关联的数据函数正在工作时可能会过期

关于c++ - 将 std::weak_ptr 传递给函数有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53599103/

相关文章:

c++ - 通过指向其派生类的指针访问类对象是否会违反严格的别名规则?

c++ - 在不复制的情况下为字符串使用外部缓冲区

c++ - 构造函数中的 std::initializer_list 转换

c++ - 通过 T* 从 std::set<shared_ptr<T>> 移除

c++ - Const 正确性、std 移动和智能指针

c++ - 如何使用 freetype2 访问单色位图中的像素状态

java - 如何在 C++ 中最有效地将像素数组渲染到窗口?

c++ - 我应该分配还是重置一个 unique_ptr?

c++ - 返回数组的函数

c++ - 确定 C++ 模板仿函数的参数数量