c++ - 将 std::weak_ptr 传递给函数有用吗?
问题描述
我正在阅读Herb Sutter 的这篇关于将智能指针传递给函数的文章。他没有提到std::weak_ptr
,老实说,我找不到传递这种智能指针有用的好场景。
该功能是否具有所有权?通过std::shared_ptr
。该函数是否只需要对底层对象进行操作?传递原始指针或引用。
那么传递std::weak_ptr
给函数 100% 没用吗?
解决方案
那么传递
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
参数,其中相关数据可能 在函数工作时过期。
推荐阅读
- java - springboot中如何映射实体类对象?
- java - 背景颜色不改变JFrame
- android - 当 UIManager 未正确初始化时,无法将 rootView 附加到 ReactInstance
- javascript - 动作必须是普通对象。相反,实际类型是:“未定义”。React-Redux
- django - 愿望清单项目在 Django 中正确显示
- python-3.x - 尝试上传多张图片但表单未提交
- vba - 如何从 vba 直接打印到 ZPL 虚拟打印机
- time-series - INFLUX DB 2.X:向数据库写入点失败:部分写入:超出保留策略的点
- reactjs - React Hook Forms + Material UI Checkboxes + FormControlLabel 没有收到默认值
- html - 将表格与绘图相邻