c++ - make_shared是否为每个成员变量做一个默认的初始化(零初始化)

标签 c++ c++11 initialization shared-ptr

将普通结构(或类)与普通旧数据类型和对象作为成员。请注意,没有定义默认构造函数。

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)...), 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导致非类成员变量归零的结构。

关于c++ - make_shared是否为每个成员变量做一个默认的初始化(零初始化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45366323/

相关文章:

wpf - 控制初始化顺序惨败

java - 将哈希函数委托(delegate)给 hibernate 中未初始化的委托(delegate)会导致更改哈希代码

c++ - 调用基类构造函数而不命名其类

c++ - 使用网络摄像头的高效肩膀检测技术

C++ 线程未加入 "Termination called without active exception"

c++ - enum vs constexpr 用于类中的实际静态常量

c++ - 初始化期间运行时类方法替换

c++ - 接口(interface)集合相互依赖

c++ - RSS 提要阅读器。 QT。烦恼

c++ - 需要语法帮助以根据模板参数的类型专门化类方法