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 将初始化类中的其他成员数据的主要内容,如果未能解决你的问题,请参考以下文章