Avertissement C26815
Le pointeur est déchaîné, car il pointe vers une instance temporaire qui a été détruite. (ES.65)
Notes
Le pointeur ou la vue créé fait référence à un objet temporaire sans nom détruit à la fin de l’instruction. Le pointeur ou la vue s’affiche.
Cette case activée reconnaît les vues et les propriétaires de la bibliothèque de modèles standard C++ (STL). Pour enseigner cette case activée sur les types créés par l’utilisateur, utilisez l’annotation[[msvc::lifetimebound]]
.
La [[msvc::lifetimebound]]
prise en charge est nouvelle dans MSVC 17.7.
Nom de l’analyse du code : LIFETIME_LOCAL_USE_AFTER_FREE_TEMP
Exemple
Considérez le code suivant compilé dans une version C++ avant C++23 :
std::optional<std::vector<int>> getTempOptVec();
void loop() {
// Oops, the std::optional value returned by getTempOptVec gets deleted
// because there is no reference to it.
for (auto i : *getTempOptVec()) // warning C26815
{
// do something interesting
}
}
void views()
{
// Oops, the 's' suffix turns the string literal into a temporary std::string.
std::string_view value("This is a std::string"s); // warning C26815
}
struct Y { int& get() [[msvc::lifetimebound]]; };
void f() {
int& r = Y{}.get(); // warning C26815
}
Ces avertissements peuvent être résolus en étendant la durée de vie de l’objet temporaire.
std::optional<std::vector<int>> getTempOptVec();
void loop() {
// Fixed by extending the lifetime of the std::optional value by giving it a name.
auto temp = getTempOptVec();
for (auto i : *temp)
{
// do something interesting
}
}
void views()
{
// Fixed by changing to a constant string literal.
std::string_view value("This is a string literal");
}
struct Y { int& get() [[msvc::lifetimebound]]; };
void f() {
Y y{};
int& r = y.get();
}