새로운 (This) ThisClass ()가 나쁜 생각입니까?


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

나는이 관용구를 본 적이 없으며 그것이 실제로 미묘하고 지저분 할 수있는 것처럼 보이지만 실제로 ( FooView최종의 경우) 그것에 대한 문제를 생각할 수는 없습니다 . 이것은 나쁜 생각입니까?


관련 / 속는 : 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.