我写了这段代码:
#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
或104
。在Ideone上没有打印任何内容。
它一定是未定义的行为。但我无法弄清楚出了什么问题。 你能指出我的错误吗?
注意:我的编译器是GCC 4.8.1,我的操作系统是Windows 7。
答案 0 :(得分:11)
您未在移动构造函数中初始化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();
}
以上工作符合预期(打印&#34;此处为1&#34;)。