ใหม่ (นี่) ThisClass () เป็นความคิดที่ไม่ดีหรือไม่?


9
class FooView final : public Something
{
    ...
    void refresh()
    {
        this->~FooView();
        new (this) FooView();
    }
}

ฉันไม่เคยเห็นสำนวนนี้และดูเหมือนว่ามันจะบอบบางและยุ่งเหยิงจริง ๆ แต่ฉันไม่สามารถคิดถึงปัญหากับมันFooViewได้ นี่เป็นความคิดที่ไม่ดีเหรอ?


เกี่ยวข้อง / dupe: stackoverflow.com/questions/58274963/… . เราสามารถรับบริบททั้งหมดของประเภทได้หรือไม่ มันสำคัญ.
NathanOliver

คำตอบ:


12

คุณสามารถทำได้ แต่คุณจะต้องทำการฟอกหน่วยความจำหากคุณมีสมาชิกอ้างอิงหรือสมาชิก const หรือหากประเภทของคลาสเปลี่ยนไป

พิจารณาสิ่งนี้:

struct FooView {
    const int val;

    void refresh()
    {
        this->~FooView();
        new (this) FooView{5};
    }
}

int main() {
    FooView fv{9};

    std::cout << fv.val; // surely 9!
    fv.refresh();
    std::cout << fv.val; // hmm... val is a const object, so it's 9 still?
}

std::launderเพื่อหลีกเลี่ยงไม่ได้กำหนดพฤติกรรมนี้คุณควรฟอกหน่วยความจำโดยใช้ คอมไพเลอร์จะคิดว่าอายุการใช้งานของจะไม่ได้รับผลกระทบจากอะไรยกเว้นfv }การฟอกจะทำให้คอมไพเลอร์คิดว่ามีวัตถุซึ่งไม่เกี่ยวข้องกับfv:

int main() {
    FooView fv{9};

    std::cout << fv.val; // surely 9!
    fv.refresh();
    std::cout << std::launder(&fv)->val; // yay, 5
}

ตอนนี้เป็นความคิดที่ดีหรือไม่? ฉันขอแนะนำให้ใช้เพราะอาจทำให้เกิดความสับสน แต่สามารถทำได้อย่างปลอดภัย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.