考虑这样的代码:
struct Foo {
int a;
Foo() { a = 17; }
//void clear() { a = 17; }
};
class Boo {
public:
void f() {
foo = Foo();
//foo.clear();
}
private:
Foo foo;
};
我用gcc
(-std=c++11
)编译了它,
并且根据f
函数foo
中的日志未被重新信号化
foo = Foo();
表达,
但如果我用clear
取消注释代码,那么一切正常。
是否应将foo = Foo();
之类的代码翻译为
Foo tmp;
memcpy(&foo, &tmp, sizeof(Foo));
或者编译器可以进行某种优化,foo = Foo();
之后我在foo
中出现了垃圾?
答案 0 :(得分:1)
此:
foo = Foo();
应构建类Foo
的新实例。
它创建一个新对象,为其分配内存并将数据成员a
初始化为17。
PS:错误在其他地方,并且由于您拒绝提供最小示例,我们无法分辨到哪里。
答案 1 :(得分:0)
您的代码应该使用成员初始化列表:
struct Foo {
int a;
Foo() : a(17) {}
//void clear() { a = 17; }
};
class Boo {
public:
Boo() : foo() {}
void f() {
foo = Foo();
//foo.clear();
}
private:
Foo foo;
};
但除此之外,我无法看到编译器生成的复制构造函数和赋值运算符将如何在任何执行点为您留下垃圾值。