警告 C26815
ポインターは破棄された一時インスタンスを指しているため、未解決です。 (ES.65)
解説
作成されたポインターまたはビューは、ステートメントの最後に破棄される名前のない一時オブジェクトを参照します。 ポインターまたはビューがダングルします。
このチェックは、C++ 標準テンプレート ライブラリ (STL) のビューと所有者を認識します。 このチェックにユーザーが作成した型について説明するには、注釈を[[msvc::lifetimebound]]
使用します。
サポートは [[msvc::lifetimebound]]
MSVC 17.7 の新機能です。
コード分析名: LIFETIME_LOCAL_USE_AFTER_FREE_TEMP
例
C++ 23 より前の C++ バージョンでコンパイルされた次のコードについて考えてみましょう。
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
}
これらの警告は、一時オブジェクトの有効期間を延長することによって解決できます。
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();
}