文章目录
一、前言介绍
RAII 是一种解决方案,是C++语言的一种管理资源、避免泄漏的惯用法。(对堆上空间进行自动化管理,利用对象自动析构的机制)
智能指针的引入:
动态内存管理经常会出现俩种问题:一种是忘记释放内存,会造成内存泄漏;一种是尚有指针引用内存的情况下就释放了他们,就会引用非法内存的指针。
为了更加安全的使用动态内存,智能指针的概念就被引入了,智能指针的行为类似常规指针,重要的区别是他负责自动释放所指的对象。
智能指针:
头文件:#include < memory >
二、auto_ptr (已废弃)
注:
1、auto_ptr 智能指针不能使用同一个裸指针进行初始化多个 auto_ptr
2、拷贝构造和等号运算符都将源智能指针置空
3、不允许隐式构造
int main()
{
int *p = new int (10);//定义一个指针 裸指针
auto_ptr<int> a_p(p);//将 p 赋给 auto_ptr
//auto_ptr<int> a_p1(p); 错误
//auto_ptr<int> a_p2 = a_p;
//a_p = a_p2;
/*
auto_ptr<int> a_p(p) 与 auto_ptr<int> a_p = p 目的一样,过程不同
auto_ptr<int> a_p = auto_ptr<int> (p) 显式构造
auto_ptr<int> a_p = p :
p 会生成临时auto_ptr 对象 使用隐式构造
使用临时对象拷贝构造a_p
析构临时对象
---经过这三个步骤会优化为 直接构造 a_p
*/
a_p.release();//返回当前指向的地址,并将当前智能指针置空
a_p.reset();//将当前智能指针指向的内存释放,指针置空
a_p.get();//获取智能指针内部指针
return 0;
}
实现:
#ifndef MAUTO_PTR_H
#define MAUTO_PTR_H
template<typename T>
class Mauto_ptr
{
public:
explicit Mauto_ptr(T*ptr == nullptr) //关键字 explicit 防止隐式构造
:_ptr(ptr)
{
}
Mauto_ptr(Mauto_ptr & src)
:_ptr(src.release())
{
}
Mauto_ptr& operator=(Mauto_ptr& src)
{
_ptr = src.release();
}
~Mauto_ptr()
{
delete _ptr;
}
T* release()
{
T* tmp = _ptr;
_ptr = NULL;
return tmp;
}
void reset()
{
delete _ptr;
_ptr = NULL;
}
T& operator*()
{
return *_ptr;
}
T* operator->()
{
return _ptr;
}
private:
T* _ptr;
};
三、unique_ptr
注:
1、unique_ptr 智能指针不能使用同一个裸指针进行初始化多个 unique_ptr
2、不允许隐式构造
3、不允许拷贝构造,不允许等号运算符重载
void fun()
{
int *p = new int(10);
unique_ptr<int> u_p;
//unique_ptr<int> u_p1;
cout<<*p