当 std::make_unique<T>() 分配给 std::unique_ptr 时会发生什么<T>?

What happens when std::make_unique<T>() assigns to std::unique_ptr<T>?

本文关键字:lt gt unique std 什么 分配 make ptr      更新时间:2023-10-16

我对std::unique_ptr有一个疑问。

当我们分配没有参数的 std::make_unique() 时,会发生什么?

例如

struct A {
  int a, b;
  A() {}
  A(int w, int e) : a(w), b(e) {}
};
int main() {
   A h(1, 2);
   std::unique_ptr<A> hello = std::make_unique<A>();
   std::cout << hello->a << std::endl;
}

在上面的代码中,我提到了默认构造函数,我得到了 hello->a 的输出作为垃圾值(随机负值)

但当我更改结构如下时,

struct A {
  int a, b;
  A() {a=0;b=0;}
  A(int w, int e) : a(w), b(e) {}
};

hello->a 的结果值为 0。

为什么默认构造函数在使用 std::make_unique() 时不将 int 赋值为 0?

传递给

std::make_unique<A>()的参数是传递给A相应构造函数的参数。在这里,您不提供任何内容,因此将调用A的默认构造函数。

为什么默认构造函数在使用 std::make_unique() 时不将 int 赋值为 0?

未初始化的内置类型成员将留下不确定的值。此行为与std::unique_ptrstd::make_unique无关;这就是内置类型默认初始化的方式。

初始化它们:

struct A {
  int a, b;
  A(): a(0), b(0) {}
  A(int w, int e) : a(w), b(e) {}
};