1

假设以下代码:

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

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

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

4

2 回答 2

2

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

于 2012-06-24T21:36:43.517 回答
1

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

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

于 2012-06-24T21:08:41.253 回答