正如Phil1970在评论a中指出的
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
实例化后立即为“not null”。