代码之家  ›  专栏  ›  技术社区  ›  Andy

具有rvalue deleter的unique\u ptr构造函数返回null?

  •  3
  • Andy  · 技术社区  · 7 年前

    下面是我用来理解 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 ? 提前感谢!

    1 回复  |  直到 7 年前
        1
  •  5
  •   TobiMcNamobi    7 年前

    正如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”。