我应该使用const shared_ptr <T>&或shared_ptr <T>作为我的lambda函数的参数吗?

时间:2019-09-15 15:52:10

标签: c++ c++11

我看过一个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函数?

1 个答案:

答案 0 :(得分:2)

  

解释将shared_ptr作为参考传递的行为,如下所示:   “拿这个指针,我不想再拥有它,你是   对此负责”

您的解释是错误的。实际上,这意味着,只要引用shared_ptr,我就不在乎您在做什么,我们-所有者在完成后会删除资源,我们不在乎您是否仍然需要它。

由于您的班级将不再使用它(可能已被破坏),因此您有潜在的危险(如果没有其他所有者的话),即没有任何参考,也就是悬而未决的参考。