将普通结构(或类)与普通旧数据类型和对象作为成员。请注意,没有定义默认构造函数。
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 打印的垃圾数据。并且该字符串默认初始化为空。 符合预期。
如果我创建一个 shared_ptr<Foo>
的实例使用 make_shared
并打印:
{
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++ 的标准吗?或者是否需要显式构造函数或显式 ={}
实例化后的语句以保证所有编译器的零初始化行为?
最佳答案
如果你看到例如this std::make_shared
reference你会看到的
The object is constructed as if by the expression
::new (pv) T(std::forward<Args>(args)...)
, wherepv
is an internalvoid*
pointer to storage suitable to hold an object of typeT
.
这意味着 std::make_shared<Foo>()
基本上是new Foo()
.也就是说,它 value initializes导致非类成员变量归零的结构。
关于c++ - make_shared是否为每个成员变量做一个默认的初始化(零初始化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45366323/