Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A mutató azért lóg, mert egy ideiglenes példányra mutat, amely megsemmisült. (ES.65)
Megjegyzések
A létrehozott mutató vagy nézet egy névtelen ideiglenes objektumra utal, amely az utasítás végén megsemmisül. A mutató vagy a nézet lógni fog.
Ez az ellenőrzés felismeri a C++ Standard Sablontár (STL) nézeteit és tulajdonosait. Ha meg szeretné tanítani ezt az ellenőrzést a felhasználó által létrehozott típusokról, használja a [[msvc::lifetimebound]] jegyzetet.
A [[msvc::lifetimebound]] támogatás az MSVC 17.7-ben új.
Kódelemzés neve: LIFETIME_LOCAL_USE_AFTER_FREE_TEMP.
példa
Vegye figyelembe a C++23 előtti C++ verzióban lefordított alábbi kódot:
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
}
Ezek a figyelmeztetések az ideiglenes objektum élettartamának meghosszabbításával javíthatók.
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();
}