gpt4 book ai didi

c++ - 为什么在同一个类上使用不同的(shared_ptr 和普通)指针构造函数会得到不同的结果?

转载 作者:搜寻专家 更新时间:2023-10-31 00:32:54 24 4
gpt4 key购买 nike

灵感来自 this question我编写了自己的小程序(使用 this answer 中的代码)并发现了让我困惑的事情。即:

拥有这些类(class):

class A {
public:
A(){}
int i;
int j;
};

class B {
public:
B() = default;
int i;
int j;
};

我写了这些类的 4 个用法,具有不同的对象构造用法:

//1
A* pa = new A(); // followed by delete pa
B* pb = new B(); // followed by delete pb
//2
shared_ptr<A> pa = make_shared<A>();
shared_ptr<B> pb = make_shared<B>();
//3
shared_ptr<A> pa ( new A() );
shared_ptr<B> pb ( new B() );
//4
shared_ptr<A> pa ( new A );
shared_ptr<B> pb ( new B );

然后我用它们来打印它们的值,如下所示:

for( int i = 0; i < 3; ++i)
{
...1..2..3..4
cout << "A : " << pa->i << "," << pa->j << endl;
cout << "B : " << pb->i << "," << pb->j << endl;
}

我在输出中收到的内容让我感到惊讶:

//1
A : 0,0
B : 0,0
A : 7388176,0
B : 0,0
A : 7388208,0
B : 0,0

//2
A : 0,0
B : 0,0
A : 0,0
B : 0,0
A : 0,0
B : 0,0

//3
A : 0,0
B : 0,0
A : 25848848,0
B : 0,0
A : 25848880,0
B : 0,0

//4
A : 0,0
B : 0,0
A : 39619600,0
B : 39619664,0
A : 39619632,0
B : 39619696,0

虽然第一个在 aforementioned question's answers 中有描述//2//3//4 发生了什么?

我在 Ubuntu 64 位上使用 gcc 4.9.2 和 5.1.0,结果相同。

Ideone link

最佳答案

您的前三个代码片段对构造的对象进行值初始化

如果类的默认构造函数不是用户提供的,值初始化执行零初始化,然后调用默认构造函数;否则,它只调用默认构造函数。

现在应用链接问题中的讨论。

对于 make_shared 情况,您在两种情况下都看到全零,这只是未定义行为的一种可能表现形式。仅此而已。


最后的片段默认初始化构造的对象,对于类类型的对象,这意味着调用默认构造函数,在每种情况下默认构造函数不执行初始化。

关于c++ - 为什么在同一个类上使用不同的(shared_ptr 和普通)指针构造函数会得到不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30178814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com