如何在lambda函数中保持对捕获的智能指针的引用?

时间:2012-06-24 20:50:06

标签: c++ c++11 atl

假设以下代码:

void SomeClass::SomeMethod()
{
    CComPtr<ISomeService> service = GetService();

    ExecuteInNewThread([&]()
    {
        service->AnotherMethod();
    });
}

函数Exec​​uteInNewThread在新线程中执行函数对象,因此可以在释放服务指针之后执行lambda函数。 什么是防止这种情况的最佳方法?在lambda末尾的SomeMethod和Release()中执行AddRef()看起来很难看。

2 个答案:

答案 0 :(得分:2)

只需按值捕获变量,让复制构造函数和析构函数担心所有权语义 - 这就是智能指针的用途。现有代码绝对不正确。

答案 1 :(得分:1)

如果在创建最内层块范围之后调用包含对局部变量的引用的闭包对象,则行为是未定义的。

我原本以为在不同的线程上执行一个闭包对象也是未定义的。