C++ std::shared_ptr 将初始化类中的其他成员数据

Posted

技术标签:

【中文标题】C++ std::shared_ptr 将初始化类中的其他成员数据【英文标题】:C++ std::shared_ptr would initialized other member data in the class 【发布时间】: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。 您的代码有错误。修复错误,谜团就会消失。如果您的问题是“为什么带有错误的代码会做奇怪的事情”,那是因为这就是错误的本质。 如果你知道未定义的行为就是未定义的行为,为什么还要问为什么会这样?它可能出于任何原因发生,但因为它没有任何意义,因为人们不能依赖未定义的行为,所以试图找到原因是没有意义的。 哎呀,也许我现在知道未定义的行为是什么意思非常感谢!! 【参考方案1】:

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

【讨论】:

@J.Wei 就像我说的,这是未定义的行为。您无法理解输出,因为您所做的是无效的。语言中没有任何内容应该使shared_ptr 导致数据成员的零初始化。这只是未定义行为的影响。 是的,我明白了。你解决了我的难题。这是我对未定义行为的含义的误解。非常感谢!!!!

以上是关于C++ std::shared_ptr 将初始化类中的其他成员数据的主要内容,如果未能解决你的问题,请参考以下文章

C++ std::shared_ptr是什么意思

[C++][原创]std::shared_ptr简单使用

std::shared_ptr 和初始化列表

C++智能指针

C++智能指针

C++ std::enable_shared_from_this