unique_ptr概述
unique_ptr 是 C++ 11 提供的用于防止内存泄漏的智能指针中的一种实现,独享被管理对象指针所有权的智能指针。unique_ptr对象包装一个原始指针,并负责其生命周期。当该对象被销毁时,会在其析构函数中删除关联的原始指针。
unique_ptr具有->和*运算符重载符,因此它可以像普通指针一样使用。
unique_ptr对象始终是关联的原始指针的唯一所有者。我们无法复制unique_ptr对象,它只能move。
由于每个unique_ptr对象都是原始指针的唯一所有者,因此在其析构函数中它直接删除关联的指针,不需要任何参考计数。
unique_ptr数据结构
为了实现unique_ptr的功能,我们采用以下数据结构。
template <typename T>
class Unique_ptr {
private:
T* ptr_; //指向原始指针
//禁用拷贝构造函数和重载=,从而独占对象
Unique_ptr(unique_ptr<T> const& up) = delete;
Unique_ptr<T>& operator=(Unique_ptr<T> const& up) = delete;
void del() {
if (ptr_) //防止释放所有权后delete
{
delete ptr_;
ptr_ = nullptr; //防止野指针
}
}
}
unique_ptr代码实现及解析
#include <iostream>
using namespace std;
template <typename T>
class Unique_ptr {
private:
T* ptr_;
//禁用拷贝构造函数和重载=,从而独占对象
Unique_ptr(unique_ptr<T> const& up) = delete;
Unique_ptr<T>& operator=(Unique_ptr<T> const& up) = delete;
void del() {
if (ptr_) //防止释放所有权后delete
{
delete ptr_;
ptr_ = nullptr; //防止野指针
}
}
public:
Unique_ptr(T* ptr = nullptr) :ptr_(ptr) {}
~Unique_ptr() {
del();
}
T& operator*() const {
return *ptr_;
}
void reset() {
del();
}
T* get() const {
return ptr_;
}
T* release() {
T* p = ptr_;
ptr_ = nullptr;
return p;
}
T* operator->() {
return ptr_;
}
};
template <typename T>
T* move(Unique_ptr<T>& tmp) {
if (tmp.get()) {
return tmp.release();
}
}