我应该使用 const shared_ptr<T>&or shared_ptr<T> 作为我的 lambda 函数的参数吗?
Should I use const shared_ptr<T>& or shared_ptr<T> as parameter to my lambda function?
我见过一个通过网络接收视频数据包的 C++11 库,为了决定如何处理这些数据包,它使用如下所示的 lambda 函数:
viedoTrack->addDelegate(std::make_shared<FrameWriterInterfaceHelper>([this](const Frame::Ptr &frame) {
//...
Frame::Ptr
只是shared_ptr<Frame>
.我不喜欢收到对shared_ptr
的引用的想法.对我来说,shared_ptr
应该始终作为副本传递,因此 lambda 函数拥有一个副本,如果花费太多时间,可以保证该shared_ptr
拥有的指针不会死亡。
然而,我将传递shared_ptr的行为解释为:"接受这个指针,我不想再拥有它了,你对此负责"。因此,如果调用此lamnda函数的类不再使用它,则将其作为引用传递。但是我认为这不是shared_ptr
的设计使用方式,相反,如果类想要这样做,它应该像这样移动unique_ptr
:
viedoTrack->addDelegate(std::make_shared<FrameWriterInterfaceHelper>([this](std::unique_ptr<Frame> frame) {
//...
那么,您将如何设计此类的 lambda 函数呢?
将
传递shared_ptr的行为解释为: "拿着这个指点,我不想再拥有这个了,你是 负责它">
你的解释是错误的。这实际上意味着,将此引用shared_ptr,我不在乎你用它做什么,我们 - 所有者会在我们完成后删除资源,我们不在乎你是否仍然需要它。
由于您的类将不再使用它(可能被破坏(,因此您处于潜在的危险中(如果没有其他所有者(,即没有引用任何内容,即悬空引用。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中