unique_ptr智能指针:
①unique_ptr (唯一)是一种定义在<memory>
中的智能指针(smart pointer)。
②unique_ptr 对象不能进行复制操作只能进行移动操作。
unique_ptr没有copy 构造函数,不支持普通的拷贝和赋值操作。
③unique是独特的、唯一的意思,故名思议,unique_ptr可以"独占"地拥有它所指向的对象。
unique_ptr和shared_ptr类型指针有很大的不同: shared_ptr允许多个指针指向同一对象,而 unique_ptr 在某一时刻只能有一个指针指向该对象(两个unique_ptr 不能指向同一个对象)。
unique_ptr对象中保存指向某个对象的指针,当它本身被删除或者离开其作用域时会自动释放其指向对象所占用的资源。
④可以进行移动构造和移动赋值操作
unique_ ptr 虽然没有支持普通的拷贝和赋值操作,但却提供了一种移动机制来将指针的所有权从一个unique_ ptr转移给另一个unique_ ptr.如果需要转移所有权,可以使用std:move()函数。为了减少构造和析构的次数
int main() {
unique_ptr<int> pInt(new int(5));
unique_ptr<int> pInt2 = std ::move(pInt); //转移所有权
// cout <<*pInt << endl; //出错,pInt为空
cout <<*pInt2 << endl;
unique_ptr<int> pInt3(std :: move(pInt2));
}
unique_ptr仿写:
#include<iostream>
using namespace std;
namespace yhp
{
template<typename _Tp>
struct default_delete//删除器
{
constexpr default_delete() noexcept = default;
void operator()(_Tp* ptr) const
{
delete ptr;
}
};
template <typename _Tp, typename _Dp = default_delete<_Tp> >class unique_ptr
{
private:
_Tp* ptr;
public:
typedef _Tp* pointer;
typedef _Tpelement_type;
typedef _Dpdelete_type;
public:
unique_ptr(const unique_ptr&) = delete;
unique_ptr& operator=(const unique_ptr&) = delete;
//返回用于析构被管理对象的删除器
delete_type get_deleter() { return delete_type(); }
public:
unique_ptr() : ptr(nullptr) {}
explicit unique_ptr(pointer p) : ptr(p) {}
unique_ptr(unique_ptr & 8 u) noexcept
{
ptr = u.release();
}
unique_ptr& operator=(unique_ptr&& u)
{
reset(u.release());return *this;
}
~unique_ptr() {
if (ptr != nullptr) {
get_deleter()(ptr);
}
ptr = nullptr;
}
//返回指向被管理对象的指针
pointer get() const { return ptr; }
//解引用指向被管理对象的指针
_Tp& operator*() const { return *get(); }
pointer operator->() const { return get(); }
//检查是否有关联的被管理对象
explicit operator boo1() const noexcept
{
return get() == nullptr ? false : true;
}
//返回一个指向被管理对象的指针,并释放所有权
pointer release() noexcept
{
pointer p = ptr;
ptr = nullptr;
return p;
}
//替换被管理对象
void reset(pointer p = nullptr)
{
get_deleter()(ptr);
ptr = p;
}
void swap(unique_ptr & u) noexcept
{
using std :: swap;
swap(ptr, u.ptr);
}
};
}