【C++】了解unique_ptr吗?可以说说其特性吗?可以手写一个自己实现版本的吗?(约274字)

特性

  • unique_ptr“唯一”拥有其所指对象,同一时刻只能有一个unique_ptr指向给定对象(通过禁止拷贝语义、只有移动语义来实现)。相比与原始指针unique_ptr用于其RAII的特性,使得在出现异常的情况下,动态资源能得到释放。
  • unique_ptr指针本身的生命周期:从unique_ptr指针创建时开始,直到离开作用域。离开作用域时,若其指向对象,则将其所指对象销毁(默认使用delete操作符,用户可指定其他操作)。
  • unique_ptr指针与其所指对象的关系:在智能指针生命周期内,可以改变智能指针所指对象,如创建智能指针时通过构造函数指定、通过reset方法重新指定、通过release方法释放所有权、通过移动语义转移所有权。

代码实现(仅供参考)

cpp
template  
struct PointerDeleter{
    void operator()(const T *ptr) {
        if(ptr) {
            delete ptr;
            ptr = nullptr;
        }
    }
};

template  >
class UniquePtr{
public:
    UniquePtr();
    UniquePtr(T *_ptr);
    UniquePtr(UniquePtr &&p); // 移动构造函数
    ~UniquePtr();

// non-copyable
private:
    UniquePtr(const UniquePtr &p);
    UniquePtr &operator=(const UniquePtr &p);

public:
    T& operator* ();
    T* operator-> ();
    UniquePtr &operator=(UniquePtr &&p); // 移动赋值,右值
    operator bool() const;

    // 返回原始指针
    T* get() const;
    // 返回指针,释放所有权
    T* release();
    // 替换被管理的对象
    void reset(T *_ptr);
    // 交换被管理的对象
    void swap(UniquePtr &p);

private:
    T *ptr;
};

template 
UniquePtr::UniquePtr() : ptr(nullptr)
{}

template 
UniquePtr::UniquePtr(T *_ptr) : ptr(_ptr)
{}

// 移交所有权
template 
UniquePtr::UniquePtr(UniquePtr &&p) : ptr(p.ptr)
{
    p.ptr = nullptr;
}

// 析构函数
template
UniquePtr::~UniquePtr() 
{
    Deleter()(ptr);
    std::cout << "unique ptr destory." << std::endl;
}

// 
template
T& UniquePtr::operator*()
{
    return *ptr;
}

// 
template
T* UniquePtr::operator->()
{
    return ptr;
}

// 
template
UniquePtr& UniquePtr::operator=(UniquePtr &&p) 
{
    std::swap(ptr, p.ptr);
    return *this;
}

template
UniquePtr::operator bool() const 
{
    return ptr != nullptr;
}

template
T* UniquePtr::get() const 
{
    return ptr;
}

template
T* UniquePtr::release()
{
    T *pointer = ptr;
    ptr = nullptr;
    return pointer;
}

template
void UniquePtr::reset(T *_ptr) 
{
    UniquePtr().swap(*this);
    ptr = _ptr;
}

template
void UniquePtr::swap(UniquePtr &p) 
{
    std::swap(ptr, p.ptr);
}

THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容