2017-07-28 35 views
9

以普通的旧数据类型和对象为成员取一个普通的结构体(或类)。请注意,没有定义默认的构造函数。make_shared是否为每个成员变量执行默认初始化(零初始化)

struct Foo 
{ 
    int x; 
    int y; 
    double z; 
    string str; 
}; 

现在,如果我声明一个实例F中的堆栈,并且尝试打印其内容:

{ 
    Foo f; 
    std::cout << f.x << " " << f.y << " " << f.z << f.str << std::endl; 
} 

结果是印刷对于x,y和z垃圾数据。并且该字符串被默认初始化为空。 正如所料。

如果我创建使用make_shared和打印的一个shared_ptr<Foo>的实例:

{ 
    shared_ptr<Foo> spFoo = make_shared<Foo>(); 
    cout << spFoo->x << " " << spFoo->y << " " << spFoo->z << spFoo->str << endl; 
} 

然后,X,Y和Z都为0。这使得看起来shared_ptr在构造对象实例后对每个成员执行默认初始化(零初始化)。至少这是我用Visual Studio的编译器观察到的。

这是C++标准吗?或者是否有必要在实例化之后有一个明确的构造函数或显式的={}语句来保证跨所有编译器的零初始行为?

+0

实际问题:你想要一个*保证*,你可以依靠这个,或者一个*方法来避免* *?前者为 – Yakk

+0

。我想确保它是标准的行为,以便它可以在不同的编译器中使用。 – selbie

回答

8

如果您看到例如this std::make_shared reference你会看到

对象被构造为通过表达式::new (pv) T(std::forward<Args>(args)...),其中pv是内部void*指针适于保持T类型的对象存储。

这意味着std::make_shared<Foo>()基本上是new Foo()。也就是说,它是导致非类成员变量归零的结构。