【问题标题】:C++ std::shared_ptr would initialized other member data in the classC++ std::shared_ptr 将初始化类中的其他成员数据
【发布时间】:2016-11-28 04:36:22
【问题描述】:

我的问题是: 当我将std::shared_ptr 引入B 类时,它会给其他数据成员零初始化。

代码如下:

class A
{
    public:  
        int data_a;  
        A():data_a(0){}  
    };

    class B 
    {
    public:
        int data_b;
        A a; 
        //shared_ptr<B> ptr_b; // the key point here
    };

    int main()
    {
        B b;
        cout << b.data_b << endl;
    }
}

由于成员 a 有一个默认 ctor,因此 B 会生成一个隐式默认 ctor。
现在我没有介绍shared_ptr,所以输出是:

-858993460

但是一旦我将share_ptr 引入代码中,输出变为:

0

为什么?是什么原因造成的?

提前致谢。

我正在使用 microsoft blend for VS community 2015 版本 14.025425.01 更新 3。

【问题讨论】:

  • 访问b.data_b 表现出未定义的行为。 Any outcome whatsoever 有效。
  • 谢谢。我知道这一点。但是我想知道当我将 shared_ptr prt_b 引入 B 类时,是什么使它生成零初始化?你看,当我做出这样的改变时,结果是 0。
  • 您的代码有错误。修复错误,谜团就会消失。如果您的问题是“为什么带有错误的代码会做奇怪的事情”,那是因为这就是错误的本质。
  • 如果你知道未定义的行为就是未定义的行为,为什么还要问为什么会这样?它可能出于任何原因发生,但因为它没有任何意义,因为人们不能依赖未定义的行为,所以试图找到原因是没有意义的。
  • 哎呀,也许我现在知道未定义的行为是什么意思非常感谢!!

标签: c++ c++11 constructor initialization


【解决方案1】:

隐式默认构造函数将默认初始化您的标量数据成员,因此它们将具有不确定的值。至于您的测试用例,当您尝试打印未初始化的对象时,它具有未定义的行为。任何输出都是有效的。

【讨论】:

  • @J.Wei 就像我说的,这是未定义的行为。您无法理解输出,因为您所做的是无效的。语言中没有任何内容应该使shared_ptr 导致数据成员的零初始化。这只是未定义行为的影响。
  • 是的,我明白了。你解决了我的难题。这是我对未定义行为的含义的误解。非常感谢!!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
相关资源
最近更新 更多