我应该使用 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?

本文关键字:gt lt ptr shared 函数 lambda 参数 我的 const 我应该 or      更新时间:2023-10-16

我见过一个通过网络接收视频数据包的 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,我不在乎你用它做什么,我们 - 所有者会在我们完成后删除资源,我们不在乎你是否仍然需要它。

由于您的类将不再使用它(可能被破坏(,因此您处于潜在的危险中(如果没有其他所有者(,即没有引用任何内容,即悬空引用。