unique_ptr可以采用nullptr值吗?

时间:2013-02-25 15:51:37

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

此代码片段有效吗? :

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

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

我用 g ++ 编译器尝试了这个并且它有效,但是其他编译器呢?

2 个答案:

答案 0 :(得分:30)

可以使用

关于unique_ptr<>类模板的C ++ 11标准的第20.7.1.2.3 / 8-9段:

  

unique_ptr& operator=(nullptr_t) noexcept;

     

效果reset()

     

后置条件get() == nullptr

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

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

答案 1 :(得分:0)

更常见的情况:

#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()