std :: unique_ptr构造函数的行为

法雷诺

首先,我知道我们应该使用std::make_unique()而不是调用std::unique_ptr构造函数,而且我知道为什么。

但是我正在查看的文档std::unique_ptr来打发时间并加深对它的了解,我发现了以下有关构造函数用法的示例

// unique_ptr constructor example
#include <iostream>
#include <memory>

int main () {
  std::default_delete<int> d;
  std::unique_ptr<int> u1;
  std::unique_ptr<int> u2 (nullptr);
  std::unique_ptr<int> u3 (new int);
  std::unique_ptr<int> u4 (new int, d);
  std::unique_ptr<int> u5 (new int, std::default_delete<int>());
  std::unique_ptr<int> u6 (std::move(u5));
  std::unique_ptr<int> u7 (std::move(u6));
  std::unique_ptr<int> u8 (std::auto_ptr<int>(new int));

  std::cout << "u1: " << (u1?"not null":"null") << '\n';
  std::cout << "u2: " << (u2?"not null":"null") << '\n';
  std::cout << "u3: " << (u3?"not null":"null") << '\n';
  std::cout << "u4: " << (u4?"not null":"null") << '\n';
  std::cout << "u5: " << (u5?"not null":"null") << '\n';
  std::cout << "u6: " << (u6?"not null":"null") << '\n';
  std::cout << "u7: " << (u7?"not null":"null") << '\n';
  std::cout << "u8: " << (u8?"not null":"null") << '\n';

  return 0;
}

它生成(并且通过执行代码验证了它)以下结果:

u1:空
u2:空
u3:不空
u4:不空
u5:空
u6:空
u7:不空
u8:不空

我正在努力理解的是:

  • 为什么u4无效而u5不是(nullptr有效
  • 为什么u7有效却无效u6

也许这些问题是非常基本的,但是我完全不明白这一点。

如果有人能启发我这些问题,我将不胜感激。

埃雷里卡

为什么u4有效而u5无效(nullptr)?

由于u5是在初始化时从移出的u6,而u4尚未从移出。保证move构造函数将从指针移动到null。它不能指向同一对象,u6因为那样会违反唯一性约束。

为什么u7有效但u6不有效?

相同的原因。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

std :: unique_ptr constexpr构造函数

std :: unique_ptr析构函数构造函数顺序

结合 std::unique_ptr 和命名构造函数

std :: list <std :: unique_ptr>:空的初始化列表与默认构造函数

是否可以使用fill构造函数创建std :: vector <std :: unique_ptr <Bar >>?

std :: unique_ptr和std :: ostringstream(SIGSEGV)的奇怪行为

来自T *的std :: unique_ptr <T>的构造函数背后的原因是什么?

移动std :: unique_ptr的构造函数/分配:内存重新分配?

没有合适的默认构造函数可用于std :: unique_ptr

将std :: unique_ptr传递给构造函数以获取所有权

为什么std :: unique_ptr构造函数接受外部指针

为什么std :: unique_ptr构造函数接受外部指针?

C ++如何从采用构造函数参数的类中创建std :: unique_ptr

我是否需要在构造函数中显式初始化std :: unique_ptr?

std :: unique_ptr,默认副本构造函数和抽象类

查看std :: unique_ptr及其nullptr_t构造函数

为什么std :: unique_ptr没有像std :: shared_ptr这样的别名构造函数?

尝试返回由NULL构造的std :: unique_ptr

是否可以在构造函数的初始化程序列表中初始化std :: unique_ptr的std :: array?

在移动构造函数中的unique_ptr上调用std :: move时出现“错误:使用已删除的函数”

std :: unique_ptr和std :: shared_ptr之间的破坏行为差异的原理是什么?

C ++ std :: unique_ptr从函数返回并测试null

如何将std :: unique_ptr传递给函数

std :: unique_ptr会干扰某些sf :: RenderWindow函数?

具有std :: unique_ptr的容器的访问器函数

std :: unique_ptr尝试引用已删除的函数

std :: unique_ptr :: release()与std :: move()

std :: unique_ptr与std :: map

没有重载函数“ std :: make_unique”的实例与参数列表匹配,但可与unique_ptr构造函数一起使用