c++ | 智能指针

文章目录

      • 一、前言介绍
      • 二、auto_ptr (已废弃)
      • 三、unique_ptr
        • 右值引用:
      • 四、shared_ptr
      • 三、unique_ptr (强智能指针)
      • 四、智能指针的交叉引用
      • 五、weak_ptr (弱智能指针)
        • 其他


一、前言介绍

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 a_p1(p); 错误
	//auto_ptr a_p2 = a_p;
	//a_p = a_p2;
	/*
	auto_ptr a_p(p) 与 auto_ptr a_p = p 目的一样,过程不同
	auto_ptr a_p = auto_ptr (p) 显式构造
	auto_ptr 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 u_p1; 
	cout<<*p

你可能感兴趣的:(c++,开发语言,后端)