智能指针介绍
智能指针(RAII)是利用对象的生命周期来管理资源的技术。
RAII,Resource Acquisition Is Initialization 顾名思义,就是在初始化对象的时候获取资源,在这个对象进行析构时会帮我们释放资源,这样做的好处有很多:
- 不需要显示的释放资源
- 可以避免因为没有及时释放资源而造成的内存泄漏
- 资源的生命周期与对象相同
智能指针原理
下面简单的实现一个智能指针
//1. 首先为了能让智能指针管理任意类型的资源, 将其设置为模板类
template<class T>
class RAIIPtr {
public:
//在构造的时候传入需要管理的资源
RAIIPtr(T* ptr = nullptr)
:_ptr(ptr){
}
//析构时释放资源
~RAIIPtr() {
if (_ptr) {
delete _ptr;
}
}
//重载 * -> 使之能像指针一样使用
T& operator*() {
return *_ptr;
}
T* operator->() {
return _ptr;
}
protected:
T* _ptr;
};
C++标准库中的智能指针
-
std::auto_ptr
设计思想:一旦发生拷贝,就将资源转移
下面模拟实现auto_ptr:template<class T> class AutoPtr { public: AutoPtr(T* ptr = nullptr) : RAIIPtr<T>(ptr) { } ~AutoPtr() { if (_ptr) { delete _ptr; } }