以普通的旧数据类型和对象为成员取一个普通的结构体(或类)。请注意,没有定义默认的构造函数。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++标准吗?或者是否有必要在实例化之后有一个明确的构造函数或显式的={}
语句来保证跨所有编译器的零初始行为?
实际问题:你想要一个*保证*,你可以依靠这个,或者一个*方法来避免* *?前者为 – Yakk
。我想确保它是标准的行为,以便它可以在不同的编译器中使用。 – selbie