此代码片段是否有效?:
unique_ptr<A> p(new A());
p = nullptr;
也就是说,我可以分配nullptr
给 aunique_ptr
吗?还是会失败?
我用g++编译器试过这个,它工作正常,但是其他编译器呢?
此代码片段是否有效?:
unique_ptr<A> p(new A());
p = nullptr;
也就是说,我可以分配nullptr
给 aunique_ptr
吗?还是会失败?
我用g++编译器试过这个,它工作正常,但是其他编译器呢?
它会起作用的。
来自 C++11 标准的第 20.7.1.2.3/8-9 段关于unique_ptr<>
类模板:
unique_ptr& operator=(nullptr_t) noexcept
;效果:
reset()
。后置条件:
get() == nullptr
这意味着类模板的定义unique_ptr<>
包括一个重载,operator =
它接受一个类型的值nullptr_t
(例如nullptr
)作为它的右手边;该段落还指定分配nullptr
给 aunique_ptr
等同于重置unique_ptr
.
因此,在此分配之后,您的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() { 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()