2013-10-09 3 views
0

У меня есть асинхронная лямбда в функции. Как я буду хранить переменную захвата.Держите переменную вокруг асинхронной лямбда

псевдопользователей Код:

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

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

Код выше, кажется, вызывает ошибки памяти, но я не знаю, почему.

+0

Сделать это 'static'? – 0x499602D2

+0

Захват путем копирования или использования 'shared_ptr', если' static' не работает для 'std :: string hi'. – dyp

+0

@James Campbell вы освобождаете строку в любой точке (т. Е. Ее можно освободить до того, как ваша лямбда ее использует?) – noelicus

ответ

1

Ошибки памяти, вероятно, связаны с тем, что hi уничтожен, когда он выходит из сферы действия. Я не знаю, как работает doSomethingThenCallThisLambda, но я предполагаю, что он фактически не вызывает его параметр напрямую, а скорее хранит его где-то, после чего возвращается hello.

Вы можете использовать shared_ptr (обратите внимание на изменения, чтобы пройти по значению):

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

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

Есть ли где-нибудь, что объясняет, как работают эти shared_pointers? и да, вся эта функция делает это, делает что-то асинхронно, и после того, как она была сделана, лямбда называется, которая в этот момент действительно привет выходит из сферы действия. –

+0

Если вы имеете в виду внутреннюю работу, это ничего, кроме простого. Если вы имеете в виду, как их использовать, в Интернете много изобилия; просто Google shared_ptr или std :: shared_ptr. –

Смежные вопросы