2015-01-24 3 views
0

я столкнулся со следующей ситуацией:C++ лямбда эталонное значение сопз были удалены в потоке

void Plugin::sendMessage(const QString& jid, const QString &message) { 
    qDebug() << "SENDING TO JID1: " << jid; 
    QtConcurrent::run([&, this]() { 
     qDebug() << "SENDING TO JID2: " << jid; 
    } 
} 

производит следующий вывод:

ОТПРАВКА В JID1: "[email protected]"

ОТПРАВКА НА JID2: «

, а затем он падает. Он выглядит как jid больше не существует в лямбда, но почему? Как тогда я могу использовать переменные по ссылкам в этом коде?

+4

Проблема, скорее всего, в том, что вы не можете контролировать, когда выполняется функция лямбда в 'QConcurrent', и это может означать, что строка, на которую ссылается' jid', была разрушена. Вместо этого сделайте снимок. –

+0

Да, это работает, если я фиксирую по значению, просто задаюсь вопросом, почему компилятор не может продлить существование ссылки до выполнения лямбда. –

+1

Поскольку компилятор понятия не имеет, что происходит, или когда (если когда-либо), эта ссылка понадобится. –

ответ

0

Если вы исходите из фона Java, обратите внимание, что ссылки на C++ и Java означают что-то совсем другое. В ссылках на Java собраны мусор, и поэтому их можно продлить на всю жизнь. В C++ отсутствует сбор мусора, а жизненное время ссылочной переменной мало связано со временем жизни ссылочного объекта.

См. Также C++ References and Java References или Programmers Why do C++ and Java both use the notion of “reference” but not in the same sense? для получения более подробного объяснения.

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