Avviso C26811
La durata della memoria a cui fa riferimento il parametro 'var' potrebbe terminare entro il momento in cui la coroutine viene ripresa.
Osservazioni:
L'avviso C26811 viene attivato quando una variabile potrebbe essere usata dopo la fine della durata in una coroutine ripresa.
Nome dell'analisi del codice: COROUTINES_USE_AFTER_FREE_PARAM
Esempio
Il codice seguente genera l'errore 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;
}
Per correggere questo avviso, prendere in considerazione l'argomento in base al valore:
std::future<void> async_coro(int a)
{
co_await ManualControl{g_suspended_coro};
++a;
}
In alternativa, quando la durata di a
è garantita la durata della coroutine, eliminare l'avviso usando gsl::suppress
e documentare i contratti di durata del codice.
Vedi anche
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per