传递std :: shared_ptr作为lambda捕获列表(C ++)的引用

时间:2017-07-06 09:36:35

标签: c++ memory-management lambda memory-leaks shared-ptr

我需要从代码中的某个点开始生成对象,直到某个任务开始执行。 像例子中一样:

shared_ptr<FromThisPointToTaskStart> ftptts = make_shared<FromThisPointToTaskStart>();
. . .
runningTask.then([ftptts](task<void> task)
{
    . . .
    try{
        // Decrementing reference and deallocating object if ref count == 0;
        ftptts = nullptr;
        task.get();
   }
}
// decrementing reference count so that it lives untill task starts
ftptts = nullptr;

问题是捕获列表将此捕获为常量,我无法更改它。 做我想要的正确方法是什么?我应该像[&amp; ftptts]一样传递它吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

我已经测试了您的代码,以下是调查结果:

  1. 将std :: shared_ptr作为非引用传递将假设您不会更改该变量,但它的生命周期将延长到.then {}块结束,即使您认为不在该块中使用它,并在外部范围内将其设置为nullptr。

  2. 传递std :: shared_ptr作为引用,当你在周围的范围内将它设置为nullptr时会解除分配对象,所以在你再次将它设置为nullptr之后你会得到一个异常。

    < / LI>
  3. 您要求的解决方案是添加可变项,但这会使所有其他参数也可变。

    runningTask.then([ftptts](task<void> task) mutable{...}