此代码片段有效吗? :
unique_ptr<A> p( new A());
p = nullptr;
也就是说,我可以将nullptr
分配给unique_ptr
吗?或者会失败?
我用 g ++ 编译器尝试了这个并且它有效,但是其他编译器呢?
答案 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()