我需要从代码中的某个点开始生成对象,直到某个任务开始执行。 像例子中一样:
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]一样传递它吗?
谢谢!
答案 0 :(得分:2)
我已经测试了您的代码,以下是调查结果:
将std :: shared_ptr作为非引用传递将假设您不会更改该变量,但它的生命周期将延长到.then {}块结束,即使您认为不在该块中使用它,并在外部范围内将其设置为nullptr。
传递std :: shared_ptr作为引用,当你在周围的范围内将它设置为nullptr时会解除分配对象,所以在你再次将它设置为nullptr之后你会得到一个异常。
< / LI>您要求的解决方案是添加可变项,但这会使所有其他参数也可变。
runningTask.then([ftptts](task<void> task) mutable{...}