Ostrzeżenie C26811

Okres istnienia pamięci, do których odwołuje się parametr "var", może zakończyć się do czasu wznowienia coroutine.

Uwagi

Ostrzeżenie C26811 jest wyzwalane, gdy zmienna może być używana po zakończeniu okresu istnienia w wznowionej koprutynie.

Nazwa analizy kodu: COROUTINES_USE_AFTER_FREE_PARAM

Przykład

Poniższy kod generuje kod C26811.

#include <experimental/generator>
#include <future>

using namespace std::experimental;

// Simple awaiter to allows to resume a suspended coroutine
struct ManualControl
{
  coroutine_handle<>& save_here;

  bool await_ready() { return false; }
  void await_suspend(coroutine_handle<> h) { save_here = h; }
  void await_resume() {}
};

coroutine_handle<> g_suspended_coro;

std::future<void> async_coro(int &a)
{
  co_await ManualControl{g_suspended_coro};   // @expected(26811), Lifetime of 'a' might end by the time this coroutine is resumed.
  ++a;
}

Aby naprawić to ostrzeżenie, rozważ użycie argumentu według wartości:

std::future<void> async_coro(int a)
{
  co_await ManualControl{g_suspended_coro};
  ++a;
}

Alternatywnie, gdy okres istnienia a programu ma zagwarantować przeżycie okresu istnienia kohroutyny, pomiń ostrzeżenie przy użyciu i gsl::suppress udokumentowanie kontraktów okresu istnienia kodu.

Zobacz też

C26810