我看过一个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函数?
答案 0 :(得分:2)
解释将shared_ptr作为参考传递的行为,如下所示: “拿这个指针,我不想再拥有它,你是 对此负责”
您的解释是错误的。实际上,这意味着,只要引用shared_ptr,我就不在乎您在做什么,我们-所有者在完成后会删除资源,我们不在乎您是否仍然需要它。>
由于您的班级将不再使用它(可能已被破坏),因此您有潜在的危险(如果没有其他所有者的话),即没有任何参考,也就是悬而未决的参考。