Yeni (this) ThisClass () kötü bir fikir mi?


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

Bu deyimi hiç görmedim ve gerçekten ince ve dağınık olabilir gibi görünüyor, ama aslında onunla ilgili bir sorun düşünemiyorum ( FooViewnihai olduğu sürece ). Bu kötü bir fikir mi?


ilgili / dupe: stackoverflow.com/questions/58274963/… . Türün tüm içeriğini alabilir miyiz? Farkeder.
NathanOliver

Yanıtlar:


12

Bunu yapabilirsiniz, ancak referans veya const üyeleriniz varsa veya sınıfın türü değişirse bunun için bellek yıkamaya ihtiyacınız olacaktır.

Bunu düşün:

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?
}

Bu tanımsız davranışı önlemek için, belleği kullanarak aklamak gerekir std::launder. Derleyici, kullanım ömrünün fvdışındaki herhangi bir şeyden etkilenmeyeceğini varsayacaktır }. Aklama derleyicinin aşağıdakilerle ilgisi olmayan bir nesne olduğunu varsaymasını sağlayacaktır fv:

int main() {
    FooView fv{9};

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

Şimdi iyi bir fikir mi? Karışıklıklara yol açabileceğinden, ancak güvenli bir şekilde yapılabileceğinden buna karşı tavsiye ederim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.