2013-10-09 29 views
0

我有一個函數中的異步lambda。我將如何保持捕捉變量。保持變量爲異步lambda

的僞代碼:

void hello() 
{ 
    std::string hi("This is hello"); 

    doSomethingThenCallThisLambda([&] 
    { 
     std::cout << hi; 
    }); 
} 

上面的代碼似乎會導致內存不足的錯誤,但我不知道爲什麼。

+0

讓它'static'? – 0x499602D2

+0

如果'static'不適用於'std :: string hi',則通過複製或使用'shared_ptr'進行捕獲。 – dyp

+0

@詹姆斯坎貝爾你是否可以在任何時候釋放字符串(例如,在你的lambda使用它之前是否可以釋放它?) – noelicus

回答

1

內存錯誤可能是由於hi超出範圍而被銷燬的事實。我不知道doSomethingThenCallThisLambda是如何工作的,但我猜測它並不直接調用它的參數,而是將它存儲在某個地方,在hello返回後調用。

您可以使用一個shared_ptr(注意變化傳遞的值):

auto hi = std::make_shared<std::string>("This is hello"); 

doSomethingThenCallThisLambda([=] 
{ 
    std::cout << *hi; 
}); 
+0

有沒有解釋這些shared_pointers如何工作的地方?是的,所有這個函數做的是它異步做一些事情,一旦它完成了lambda被調用,那時hi確實超出了範圍。 –

+0

如果你的意思是內在的運作,它不是簡單的。如果你的意思是如何使用它們,網上有大量的材料;只是Google shared_ptr或std :: shared_ptr。 –