定义
template<class T, class Deleter = std::default_delete<T>> class unique_ptr;
template <class T, class Deleter>
class unique_ptr<T[], Deleter>;
std::unique_ptr
是通过指针占有并管理另一对象, 并在unique_ptr
离开作用域时释放该对象的智能指针。
释放对象的时机-> :
- 销毁了管理的unique_ptr对象
- 通过operator= 或 reset() 赋值另一指针给管理的 unique_ptr对象
也可以通过调用get_deleter()(ptr) 删除对象;
unique_ptr 是可以转义对象的管理权的,但是被const修饰之后就不能够被转移了
常用的成员函数
函数名字 | 作用 |
---|---|
operator= | 赋值 |
reset | 替换被管理对象 |
swap | 交换被管理对象 |
release | 返回被管理对象的指针,并且释放一个对象所有权 |
get | 返回被管理对象的指针 |
常用的非成员函数
函数名字 | 作用 |
---|---|
make_unique | 创建一个管理对象的独占指针 |
std::swap(std::unique_ptr) | 特化 std::swap 算法 |
示例代码
struct Base {
// 创建一个虚函数
virtual void bar() { std::cout << "Base::bar()
"; }
virtual ~Base() = default;
std::string val;
};
struct Derived : Base {
Derived() { std::cout << "Derived::Constructor
"; }
~Derived() { std::cout << "Derived::Descontructor
"; }
void bar() override { std::cout << "Derived::bar()
"; }
std::string val;
};
int main()
{
std::cout << "
unique_ptr 指向对象的所有权的测试---->
";
{
// ptr_Derived拥有对象的所有权
auto ptr_Derived = std::make_unique<Derived> ();
ptr_Derived->val = "unique_ptr";
auto ptr_MoveD = std::move(ptr_Derived); //ptr_Derived 不在拥有对象所有权
assert(!ptr_Derived); //ptr_Derived为empty
ptr_MoveD->bar();
std::cout << ptr_MoveD->val << std::endl;
// 这里将会调用一次Derived的析构函数
}
std::cout << "
多态运行时测试----->
";
{
std::unique_ptr<Base> p_base = std::make_unique<Derived>(); // p_base是指向基类的指针,但是占有D的unique_ptr
p_base->bar(); // 这里将调用的Derived的bar函数
std::vector<std::unique_ptr<Base>> v; // 容器也可以存储unique_ptr对象
v.push_back(std::move(p_base));
v.push_back(std::make_unique<Derived>());
v.emplace_back(new Derived);
for (auto& itr : v)
{
itr->bar();
}
// 这里将调用3次析构函数
}
std::cout << "
数组形式的unique_str对象测试--->
";
{
std::unique_ptr<Derived[]> parr{ new Derived[4] };
// 这里将调用4次析构函数
}
return 0;
}
运行结果
unique_ptr 指向对象的所有权的测试---->
Derived::Constructor
Derived::bar()
unique_ptr
Derived::Descontructor
多态运行时测试----->
Derived::Constructor
Derived::bar()
Derived::Constructor
Derived::Constructor
Derived::bar()
Derived::bar()
Derived::bar()
Derived::Descontructor
Derived::Descontructor
Derived::Descontructor
数组形式的unique_str对象测试--->
Derived::Constructor
Derived::Constructor
Derived::Constructor
Derived::Constructor
Derived::Descontructor
Derived::Descontructor
Derived::Descontructor
Derived::Descontructor