【发布时间】: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
此代码片段有效吗? :
unique_ptr<A> p(new A());
p = nullptr;
也就是说,我可以将 nullptr 分配给 unique_ptr 吗?还是会失败?
我用 g++ 编译器尝试了这个,它成功了,但是其他编译器呢?
【问题讨论】:
标签: c++ c++11 pointers unique-ptr nullptr
它会起作用。
来自 C++11 标准关于 unique_ptr<> 类模板的第 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 对象将被销毁。
【讨论】:
nullptr_t 类型的变量,但我怀疑你永远需要这样做。
更常见的情况:
#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()
【讨论】: