我写了这段代码:
#include <cstdio>
#include <queue>
class Obj {
bool x;
public:
Obj(): x(true) {}
Obj(Obj&& o) {
o.x = false;
}
~Obj() {
if(x) {
std::puts("Here");
std::printf("%d\n", x ? 1 : 0);
}
}
};
int main() {
std::queue<Obj> q;
q.push(Obj());
q.pop();
}
启用优化后,我得到了一个令人困惑的结果:
Here
40
并且数量可以是160
, 24
, 96
or 104
通过以不同的方式执行程序。在Ideone http://ideone.com/dIooX3没有打印任何内容。
这一定是一种未定义的行为。但我不知道出了什么问题。你能指出我的错误吗?
注意:我的编译器是GCC 4.8.1,操作系统是Windows 7。
你没有初始化this->x
在你的移动构造函数中。我很确定未初始化变量的条件是未定义的行为。
#include <cstdio>
#include <queue>
class Obj {
bool x;
public:
Obj(): x(true) {}
Obj(Obj&& o) : x(true) { // Hi!
o.x = false;
}
~Obj() {
if(x) {
std::puts("Here");
std::printf("%d\n", x ? 1 : 0);
}
}
};
int main() {
std::queue<Obj> q;
q.push(Obj());
q.pop();
}
上面的代码按预期工作(打印“Here 1”)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)