【发布时间】:2020-01-20 15:28:55
【问题描述】:
首先,我知道我们应该使用std::make_unique() 而不是调用std::unique_ptr 构造函数,我知道为什么。
但我正在查看std::unique_ptr 的文档以打发时间并加深对它的了解,我发现following examples 关于构造函数的用法:
// 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无效?
也许这些问题非常基本,但我完全没有抓住重点。
如果有人能就这些问题启发我,我将不胜感激。
【问题讨论】:
-
u5在初始化u6时死亡,thenu6在初始化u7时死亡。std::unique_ptr将在移动时变为 null,根据设计,强制保证其唯一所有权。 -
@AlanBirtles TLDR:创建多个 unique_ptr 变量作为函数参数并且其中一个抛出时的异常安全性。参见例如stackoverflow.com/a/22571331/256138
标签: c++ smart-pointers move-semantics