以下是我用来理解std::unique_ptr
行为的代码段:
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';
有人可以解释为null
和u5
打印u6
的原因,而不是u7
的原因吗?提前谢谢!
答案 0 :(得分:5)
正如Phil1970在他的评论中指出的那样,std::unique_pointer
实例在分配给另一个实例(使用nullptr
后,如代码示例中所示)后变为(相当于)std::move
。实际上这就是std::unique_ptr
的用途。这是独一无二的。
现在考虑这段代码:
#include <memory>
#include <iostream>
int main()
{
std::default_delete<int> d;
std::unique_ptr<int> u1;
std::cout << "u1: " << (u1 ? "not null" : "null") << '\n';
std::unique_ptr<int> u2(nullptr);
std::cout << "u2: " << (u2 ? "not null" : "null") << '\n';
std::unique_ptr<int> u3(new int);
std::cout << "u3: " << (u3 ? "not null" : "null") << '\n';
std::unique_ptr<int> u4(new int, d);
std::cout << "u4: " << (u4 ? "not null" : "null") << '\n';
std::unique_ptr<int> u5(new int, std::default_delete<int>());
std::cout << "u5: " << (u5 ? "not null" : "null") << '\n';
std::unique_ptr<int> u6(std::move(u5));
std::cout << "u6: " << (u6 ? "not null" : "null") << '\n';
std::unique_ptr<int> u7(std::move(u6));
std::cout << "u7: " << (u7 ? "not null" : "null") << '\n';
}
当executed 时,您会看到u5
和u6
是&#34;不是空的&#34;实例化后立即。