新的(this)ThisClass()是个坏主意吗?


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

我从未见过这种习语,而且看起来确实很微妙和凌乱,但实际上我想不出它有什么问题(只要FooView是最终的)。这是一个坏主意吗?


相关/重复:stackoverflow.com/questions/58274963/…。我们可以获取该类型的完整上下文吗?这非常重要。
NathanOliver

Answers:


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
}

现在是个好主意吗?我建议您不要这样做,因为它可能导致混乱,但是可以安全地进行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.