【问题标题】:Can a unique_ptr take a nullptr value?unique_ptr 可以采用 nullptr 值吗?
【发布时间】:2013-02-10 19:50:04
【问题描述】:

此代码片段有效吗? :

unique_ptr<A> p(new A());
p = nullptr;

也就是说,我可以将 nullptr 分配给 unique_ptr 吗?还是会失败?

我用 g++ 编译器尝试了这个,它成功了,但是其他编译器呢?

【问题讨论】:

    标签: c++ c++11 pointers unique-ptr nullptr


    【解决方案1】:

    它会起作用

    来自 C++11 标准关于 unique_ptr&lt;&gt; 类模板的第 20.7.1.2.3/8-9 段:

    unique_ptr&amp; operator=(nullptr_t) noexcept;

    效果reset().

    后置条件get() == nullptr

    这意味着类模板unique_ptr&lt;&gt; 的定义包含operator = 的重载,它接受nullptr_t 类型的值(例如nullptr)作为其右侧;该段落还指定将nullptr 分配给unique_ptr 等效于重置unique_ptr

    因此,在此分配之后,您的 A 对象将被销毁。

    【讨论】:

    • 我明白了。顺便说一句,只有 nullptr 有 nullptr_t,它是这样做的,不是吗?
    • @Zhen:标准没有规定这个。你可以创建一个nullptr_t 类型的变量,但我怀疑你永远需要这样做。
    【解决方案2】:

    更常见的情况:

    #include <iostream>
    #include <string>
    #include <memory>
    
    class A {
    public:
        A() {std::cout << "A::A()" << std::endl;}
        ~A() {std::cout << "A::~A()" << std::endl;}
    };
    
    class B {
    public:
        std::unique_ptr<A> pA;
        B() {std::cout << "B::B()" << std::endl;}
        ~B() { std::cout << "B::~B()" << std::endl;}
    };
    
    int main()
    {
        std::unique_ptr<A> p1(new A());
    
        B b;
        b.pA = std::move(p1);
    }
    

    输出:

    A::A()
    B::B()
    B::~B()
    A::~A()
    

    此代码示例可能不直观:

    #include <iostream>
    #include <string>
    #include <memory>
    
    class A {
    public:
        A() {std::cout << "A::A()" << std::endl;}
        ~A() {std::cout << "A::~A()" << std::endl;}
    };
    
    class B {
    public:
        std::unique_ptr<A> pA;
        B() {std::cout << "B::B()" << std::endl;}
        ~B() 
        {
            if (pA)
            {
                std::cout << "pA not nullptr!" << std::endl;
                pA = nullptr; // Will call A::~A()
            }
            std::cout << "B::~B()" << std::endl;
        }
    };
    
    int main()
    {
        std::unique_ptr<A> p1(new A());
    
        B b;
        b.pA = std::move(p1);
    }
    

    输出:

    A::A()
    B::B()
    pA not nullptr!
    A::~A()
    B::~B()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多