MiddleДебаггингОчень частоЕщё не отвечали
Почему эта возвращённая лямбда читает освобождённую память?
Эта фабрика возвращает счётчик, но вызов результата даёт мусор или падение.
std::function<int()> makeCounter() {
int count = 0;
return [&]() { return ++count; };
}
Найдите и исправьте ошибку.
Лямбда захватывает count по ссылке ([&]), но count уничтожается, когда makeCounter возвращается, поэтому вызов возвращённого std::function читает висячую ссылку — UB. Решение: захват по значению, [count]() mutable { return ++count; }.
- ✗Считать, что захват по ссылке продлевает время жизни захваченной переменной
- ✗Винить std::function вместо захвата по ссылке
- ✗Думать, что добавление mutable исправляет то, что на деле является ошибкой времени жизни
- →Когда захват по ссылке в лямбде действительно безопасен?
- →Почему захвату по значению нужен
mutable, чтобы его можно было изменять?