考虑此代码(针对renew
和cleanse
的不同值):
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
参数!
答案 0 :(得分:0)
你没有破坏内存,你只手动调用析构函数(在这种情况下,它与调用普通方法没有区别)。您的t
变量的内存(堆栈部分)未被“释放”。所以这个断言总是会传递你当前的代码。