带有默认构造函数加分配的Reinit变量

reinit variable with default constructor plus assignment

本文关键字:Reinit 变量 分配 默认 构造函数      更新时间:2023-10-16

考虑这样的代码:

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函数中的logs, foo并未重新化 foo = Foo();表达式,但是如果我将代码与clear

,一切正常

是像foo = Foo();这样的代码,应转换为

Foo tmp;
memcpy(&foo, &tmp, sizeof(Foo));

或编译器可以进行某种优化,在foo = Foo();之后,我在foo中得到了垃圾?

this:

foo = Foo();

应构建Foo类的新实例。

它创建一个新对象,为其分配内存并初始化数据成员a至17。


ps:错误在其他地方,由于您拒绝提供最小的例子,因此我们无法分辨在哪里。

您的代码可能应使用成员初始化器列表:

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;
};

但是,除此之外,我看不到编译器生成的复制构造函数和分配操作员将在执行的任何执行点都会使您带有垃圾值