我有一個函數中的異步lambda。我將如何保持捕捉變量。保持變量爲異步lambda
的僞代碼:
void hello()
{
std::string hi("This is hello");
doSomethingThenCallThisLambda([&]
{
std::cout << hi;
});
}
上面的代碼似乎會導致內存不足的錯誤,但我不知道爲什麼。
我有一個函數中的異步lambda。我將如何保持捕捉變量。保持變量爲異步lambda
的僞代碼:
void hello()
{
std::string hi("This is hello");
doSomethingThenCallThisLambda([&]
{
std::cout << hi;
});
}
上面的代碼似乎會導致內存不足的錯誤,但我不知道爲什麼。
內存錯誤可能是由於hi
超出範圍而被銷燬的事實。我不知道doSomethingThenCallThisLambda
是如何工作的,但我猜測它並不直接調用它的參數,而是將它存儲在某個地方,在hello
返回後調用。
您可以使用一個shared_ptr(注意變化傳遞的值):
auto hi = std::make_shared<std::string>("This is hello");
doSomethingThenCallThisLambda([=]
{
std::cout << *hi;
});
有沒有解釋這些shared_pointers如何工作的地方?是的,所有這個函數做的是它異步做一些事情,一旦它完成了lambda被調用,那時hi確實超出了範圍。 –
如果你的意思是內在的運作,它不是簡單的。如果你的意思是如何使用它們,網上有大量的材料;只是Google shared_ptr或std :: shared_ptr。 –
讓它'static'? – 0x499602D2
如果'static'不適用於'std :: string hi',則通過複製或使用'shared_ptr'進行捕獲。 – dyp
@詹姆斯坎貝爾你是否可以在任何時候釋放字符串(例如,在你的lambda使用它之前是否可以釋放它?) – noelicus