make_shared 是否对每个成员变量进行默认初始化(零初始化)
Does make_shared do a default initialization (zero-init) for each member variable
以普通结构(或class)作为成员的普通旧数据类型和对象。请注意,没有定义默认构造函数。
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++ 的标准吗?或者是否有必要在实例化后有一个显式构造函数或显式 ={}
语句以保证所有编译器的零初始化行为?
如果你看到例如this std::make_shared
reference你会看到
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
.
这意味着 std::make_shared<Foo>()
基本上是 new Foo()
。也就是说,它 value initializes 导致非 class 成员变量归零的结构。
更准确地说,std::make_shared employes value initialization语法,
The object is constructed as if by the expression ::new (pv) T(std::forward<Args>(args)...)
对于初始化列表为空的Foo
,这意味着其所有具有内置类型的成员都将是zero-initialized, and std::string
will be default-initialized。
以普通结构(或class)作为成员的普通旧数据类型和对象。请注意,没有定义默认构造函数。
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++ 的标准吗?或者是否有必要在实例化后有一个显式构造函数或显式 ={}
语句以保证所有编译器的零初始化行为?
如果你看到例如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 导致非 class 成员变量归零的结构。
更准确地说,std::make_shared employes value initialization语法,
The object is constructed as if by the expression
::new (pv) T(std::forward<Args>(args)...)
对于初始化列表为空的Foo
,这意味着其所有具有内置类型的成员都将是zero-initialized, and std::string
will be default-initialized。