美文网首页Exceptional C++
【Exceptional C++(22)】对象的生存期(一)

【Exceptional C++(22)】对象的生存期(一)

作者: downdemo | 来源:发表于2018-01-30 13:36 被阅读1次
    void f() {
        T t(1);
        T& rt = t;
        // #1:使用t或rt做一些事
        t.~T();
        new (&t) T(2);
        // #2:使用t或rt做一些事
    } // t被再次销毁
    
    • #2处代码是安全合法的,但函数作为一个整体它不是异常安全的,且这是一个坏习惯
    • 在调用T(2)时,T的构造函数有抛出异常的可能,如果T(2)抛出异常,在原来t所在的内存区域将不会有新的对象被构造,而在函数末尾T::~T()仍被正常调用,这样t被构造一次,却被销毁两次
    • 如果出现在成员函数中,会充满危险
    void T::f(int i) {
        this->~T();
        new (this) T(i);
    }
    // 现在可以说这已经不安全了,考虑下面代码
    class U : /*...*/ public T { ... };
    void f() {
        A t(1);
        B& rt = t;
        // #1:使用t或rt做一些事
        t.f(2);
        // #2:使用t或rt做一些事
    } // t被再次销毁
    
    • 如果A是T,那么#2处代码仍然可行,即使B不是T(可能是T的基类),如果A是U,无论B是什么都是错的,因为对t.f()的调用将对象切割了,t.f()用属于另一个不同型别的对象替换了原来的对象,即函数使用了T而不是U

    相关文章

      网友评论

        本文标题:【Exceptional C++(22)】对象的生存期(一)

        本文链接:https://www.haomeiwen.com/subject/nvfczxtx.html