Does make_shared do a default initialization (zero-init) for each member variable

独自空忆成欢 提交于 2019-12-10 01:36:37

问题


Take an ordinary struct (or class) with Plain Old Data types and objects as members. Note that there is no default constructor defined.

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

Now if I declare an instance f on the stack and attempt to print its contents:

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

The result is garbage data printed for x, y, and z. And the string is default initialized to be empty. As expected.

If I create an instance of a shared_ptr<Foo> using make_shared and print:

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

Then, x, y, and z are all 0. Which makes it appear that shared_ptr performs a default initialization (zero init) on each member after the object instance is constructed. At least that's what I observe with Visual Studio's compiler.

Is this standard for C++? Or would it be necessary to have an explicit constructor or explicit ={} statement after instantiation to guarantee zero-init behavior across all compilers?


回答1:


If you see e.g. this std::make_shared reference you will see that

The object is constructed as if by the expression ::new (pv) T(std::forward<Args>(args)...), where pv is an internal void* pointer to storage suitable to hold an object of type T.

That means std::make_shared<Foo>() basically does new Foo(). That is, it value initializes the structure which leads to the zeroing of the non-class member variables.




回答2:


To be more precise, std::make_shared employes value initialization syntax,

The object is constructed as if by the expression ::new (pv) T(std::forward<Args>(args)...)

For Foo with an empty initializer list, that means all its members with built-in type will be zero-initialized, and std::string will be default-initialized.



来源:https://stackoverflow.com/questions/45366323/does-make-shared-do-a-default-initialization-zero-init-for-each-member-variabl

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!