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++的标准吗? 还是有必要在实例化后使用显式构造函数或显式={}语句来保证所有编译器的零初始化行为?

如果你看到例如这个std::make_shared参考,你会看到

该对象就像由表达式::new (pv) T(std::forward<Args>(args)...)构造一样,其中pv是指向适合容纳T类型的对象的存储的内部void*指针。

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

更准确地说,std::make_shared 采用了值初始化语法,

对象就像由表达式构造一样::new (pv) T(std::forward<Args>(args)...)

对于初始值设定项列表为空的Foo,这意味着其所有具有内置类型的成员都将初始化为零,std::string将默认初始化。

最新更新