RAII是什么?
RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。本质上来讲,RAII就是将管理资源的责任交给一个对象负责,在该对象的生命周期内,资源始终有效。
智能指针:即RAII最具代表的实现,使用智能指针,可以实现自动内存管理,再也不需要担心忘记delete造成的内存泄漏。毫不夸张的来讲,有了智能指针,代码中几乎不需要再出现delete了。
智能指针的原理
- RAII特性;
- 重载operator*和opertaor->,使其具有像指针一样的行为;
- 不同的智能指针的具体实现方法不同;
以下这些智能指针都定义在memory头文件中;(注意不是<memory.h>)
下面来详细介绍C++98和C++11的这几种智能指针的实现原理以及缺陷:
(快速选择:)
1.auto_ptr
2. unique_ptr
3. shared_ptr
4. weak_ptr
auto_ptr
auto_ptr的原理:资源管理权的转移 + RAII + 运算符的重载(指针式操作方法);
下面是auto_ptr的模拟实现:
template<class T>
class AutoPtr
{
private:
T* _ptr;
private:
void Release()
{
if (_ptr)
delete _ptr;
}
public:
AutoPtr(T* ptr == nullptr)
:_ptr(ptr)
{
}
AutoPtr(AutoPtr<T>& ap)
:_ptr(ap._ptr)
{
ap._ptr = nullptr;
}
AutoPtr<T>& operator=(AutoPtr<T>& ap)
{
if (this != &ap)
{
Release();
_ptr = ap._ptr;
ap._ptr = nullptr;
}
return *this;
}
~AutoPtr()
{
Release();
}
T& operator*()
{
return *_ptr;
}
T* operator->()
{
return _ptr;
}
}