传递 std::shared_ptr 作为对 lambda 捕获列表的引用 (C++)
Passing std::shared_ptr as reference to the lambda capture list (C++)
我需要对象从代码中的某个点开始一直存在,直到某个任务开始执行。
例如:
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;
问题是捕获列表将其捕获为常量,我无法更改它。
做我想做的事的正确方法是什么?我应该像 [&ftptts] 一样传递它吗?
谢谢!
我测试了您的代码,结果如下:
将 std::shared_ptr 作为非引用传递将假设您不会更改该变量,但它的生命周期将延长到 .then{} 块结束,即使您不认为在该块中使用它,然后在外部范围内将其设置为 nullptr。
传递 std::shared_ptr 作为引用,当您在周围范围内将其设置为 nullptr 时,将释放对象,因此在 then 块中再次将其设置为 nullptr 后,您将得到一个异常。
您要求的解决方案是添加可变参数,尽管这也会使所有其他参数可变。
runningTask.then([ftptts](task<void> task) mutable{...}
我需要对象从代码中的某个点开始一直存在,直到某个任务开始执行。 例如:
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;
问题是捕获列表将其捕获为常量,我无法更改它。 做我想做的事的正确方法是什么?我应该像 [&ftptts] 一样传递它吗?
谢谢!
我测试了您的代码,结果如下:
将 std::shared_ptr 作为非引用传递将假设您不会更改该变量,但它的生命周期将延长到 .then{} 块结束,即使您不认为在该块中使用它,然后在外部范围内将其设置为 nullptr。
传递 std::shared_ptr 作为引用,当您在周围范围内将其设置为 nullptr 时,将释放对象,因此在 then 块中再次将其设置为 nullptr 后,您将得到一个异常。
您要求的解决方案是添加可变参数,尽管这也会使所有其他参数可变。
runningTask.then([ftptts](task<void> task) mutable{...}