Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Pointer menjuntai karena menunjuk pada instans sementara yang dihancurkan. (ES.65)
Keterangan
Penunjuk atau tampilan yang dibuat mengacu pada objek sementara yang tidak disebutkan namanya yang dihancurkan di akhir pernyataan. Penunjuk atau tampilan akan menjuntai.
Pemeriksaan ini mengenali tampilan dan pemilik dari Pustaka Templat Standar (STL) C++. Untuk mengajarkan pemeriksaan ini tentang jenis yang ditulis pengguna, gunakan [[msvc::lifetimebound]] anotasi.
[[msvc::lifetimebound]] Dukungan ini baru dalam MSVC 17.7.
Nama analisis kode: LIFETIME_LOCAL_USE_AFTER_FREE_TEMP
Contoh
Pertimbangkan kode berikut yang dikompilasi dalam versi C++ sebelum 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
}
Peringatan ini dapat diperbaiki dengan memperpanjang masa pakai objek sementara.
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();
}