特性
- 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
暂无评论内容