一个对象被破坏后,标量类型的子对象会发生什么?

时间:2012-07-24 19:04:49

标签: c++ destructor language-lawyer object-lifetime explicit-destructor-call

考虑此代码(针对renewcleanse的不同值):

struct T {
    int mem;
    T() { }
    ~T() { mem = 42; }
};

// identity functions, 
// but breaks any connexion between input and output
int &cleanse_ref(int &r) {
    int *volatile pv = &r; // could also use cin/cout here
    return *pv;
}

void foo () {
    T t;
    int &ref = t.mem;
    int &ref2 = cleanse ? cleanse_ref(ref) : ref;
    t.~T();
    if (renew)
        new (&t) T;
    assert(ref2 == 42);
    exit(0);
}

assert是否可以通过?

我知道这种风格推荐。 意见之类的“这不是一种合理的做法”在这里

我想要一个答案,显示来自标准报价的完整逻辑证据。编译器编写者的观点也可能很有趣。

编辑:现在有两个问题合二为一!请参阅renew参数(使用renew == 0,这是原始问题。)

编辑2:我想我的问题确实是:什么是成员对象?

编辑3:现在使用另一个cleanse参数!

1 个答案:

答案 0 :(得分:0)

你没有破坏内存,你只手动调用析构函数(在这种情况下,它与调用普通方法没有区别)。您的t变量的内存(堆栈部分)未被“释放”。所以这个断言总是会传递你当前的代码。