2012-06-24 56 views
1

假設以下代碼:如何在lambda函數中引用捕獲的智能指針?

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

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

功能ExecuteInNewThread執行新線程功能對象從而服務指針將被釋放後可以執行lambda函數。 防止這種情況的最佳方法是什麼?在SomeMethod中執行AddRef()和在lambda結尾的Release()看起來很醜。

+10

爲什麼不按值捕獲智能指針? (我不知道CCompPtr是/什麼。) – Mat

+1

通過引用捕獲在新線程中執行的函數的局部變量是很奇怪的......並且是錯誤的。 – Griwes

+0

@Mat,謝謝。我只是忘記了有一個選項可以通過lambdas中的值捕獲變量。 – vkrzv

回答

2

只是通過值捕獲變量,讓複製構造函數和析構函數擔心所有權語義 - 這就是智能指針的用途。現有的代碼肯定是不正確的。

1

如果在其創建的最內層塊範圍之後調用包含對局部變量的引用的閉包對象,則行爲是未定義的。

我原以爲在另一個線程上執行一個閉包對象也是未定義的。