V1047. Lifetime of the lambda is greater than lifetime of the local variable captured by reference.

Анализатор обнаружил подозрительный захват переменной в лямбда функции.

Рассмотрим варианты срабатывания диагностики:

Пример 1:

function lambda;
{
  auto obj = dummy<int>{ 42 };
  lambda = [&obj]() { .... };
}

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

Вероятно, объект нужно захватить по значению:

function lambda;
{
  auto obj = dummy<int>{ 42 };
  lambda = [obj]() { .... };
}

Пример 2:

function lambda;
{
  auto obj1 = dummy<int>{ 42 };
  auto obj2 = dummy<int>{ 42 };
  lambda = [&]() { .... };
}

В этом случае диагностика определит, что обе переменные захвачены по ссылке и выдаст предупреждение на каждую из них.

Также возможно, что функция возвращает лямбду, захватившую локальную переменную по ссылке.

Пример 3:

auto obj = dummy<int>{ 42 };
return [&obj]() { .... };

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

Данная диагностика классифицируется как:


Найденные ошибки

Проверено проектов
411
Собрано ошибок
14 123

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;
Этот сайт использует куки и другие технологии, чтобы предоставить вам более персонализированный опыт. Продолжая просмотр страниц нашего веб-сайта, вы принимаете условия использования этих файлов. Если вы не хотите, чтобы ваши данные обрабатывались, пожалуйста, покиньте данный сайт. Подробнее →
Принять