class FooView final : public Something
{
...
void refresh()
{
this->~FooView();
new (this) FooView();
}
}
Saya belum pernah melihat idiom ini, dan sepertinya itu bisa sangat halus dan berantakan, tetapi saya tidak dapat benar-benar memikirkan masalah dengan itu (selama FooView
final). Apakah ini ide yang buruk?
c++
placement-new
luqui
sumber
sumber
Jawaban:
Anda dapat melakukannya, tetapi Anda akan memerlukan pencucian memori untuk itu jika Anda memiliki anggota referensi atau konst, atau jika jenis kelas berubah.
Pertimbangkan ini:
Untuk menghindari perilaku tidak terdefinisi ini, Anda harus mencuci memori menggunakan
std::launder
. Kompilator akan menganggap bahwa masa hidupfv
tidak akan terpengaruh oleh apa pun kecuali}
. Pencucian akan membuat kompiler menganggap ada objek, tidak terkait denganfv
:Sekarang apakah itu ide yang bagus? Saya menyarankan agar hal itu tidak membingungkan, tetapi bisa dilakukan dengan aman.
sumber