c++智能指针详解

本文详细介绍了C++智能指针的原理和应用,包括为何需要智能指针、智能指针的实现版本(如auto_ptr、unique_ptr、shared_ptr和weak_ptr)及其特点。重点讨论了shared_ptr的线程安全问题、循环引用以及weak_ptr如何解决这个问题,阐述了智能指针在资源管理中的重要性。
摘要由CSDN通过智能技术生成

c++智能指针

为什么要有智能指针?

c++最令人失望的是没有资源回收功能,资源的回收依赖于显示定义的回收资源的函数。为了实现资源的自动回收,c++引入了一种能够近似自动回收的方法就是智能指针。

智能指针是基于一种叫做 RAII 的思想,(Resource Acquisition Is Initialization) 将资源的回收在定义变量的时候就设置好。智能指针的作用其实就是将资源的管理分配给每一个对象,随着对象的消亡而调用析构函数然后将资源粉碎掉。

这样做的好处是:

1.不需要显示的释放资源

2.采用这种方式,对象所需的资源在其生命周期内始终有效。

智能指针有哪些实现版本

智能指针不应该只是一个对象,它还应该能够干指针能干的事情,比如说 * 解引用
和 -> 箭头,如果有需要的话还必须有 = 号功能。也就是说要对这些功能进行函数重载。

auto_ptr 的实现版本1


	template <class T>
    class AutoPtr
    {
   
    private:
    	T* _Ptr;
    public:
    	AutoPtr(T *ptr = nullptr) :_Ptr(ptr)
    	{
   
    	}
    	AutoPtr(const AutoPtr<T> &ap) :_Ptr(ap._Ptr)
    	{
   
    		ap._Ptr = nullptr;
    	}
    	AutoPtr<T> &operator = (const AutoPtr<T> &ap)
    	{
   
    		if (this != &ap)
    		{
   
    			delete this->_Ptr;
    			this->_Ptr = ap._Ptr;
    			ap._Ptr = nullptr;
    		}
    		return *this;
    	}
    	~AutoPtr()
    	{
   
    		delete _Ptr;
    	}
    	T& operator *()
    	{
   
    		if (_Ptr == nullptr)
    		{
   
    			throw ap;
    		}
    		return *_Ptr;
    	}
    	T& operator ->()
    	{
   
    		if (_Ptr == nullptr)
    		{
   
    			throw ap;
    		}
    		return _Ptr;
    	}
    };

在这里插入图片描述
以上auto_ptr的主要思想是,

1.资源只能被一个指针管理
2.如果使用一个管理了资源的指针去初始化另一个指针的话。那么管理资源的权限将会被转移。
3.转移过后的指针将会被赋予nullptr。也就是被悬空了。

以上存在的问题,如果空指针被错误的解引用会造成程序崩溃。

auto_ptr 的实现版本2

为了使得多个职能指针共同使用同一块空间,在以上的基础上做了一点改变。设立一个owner的bool变量,只有为true的owner才能够释放资源。使用拷贝构造函数或者赋值运算符时,会造成管理权限的转移。

    template <class T>
    class Auto_ptr{
   
    private:
    	mutable T * _ptr;
    	mutable	bool owner;
    public:
    	Auto_ptr(T *ptr = nullptr) :_ptr(ptr), owner(true)
    	{
   }
    	Auto_ptr(const Auto_ptr & ap) :_ptr(ap._ptr), owner(true)
    	{
   
    		if (this != &ap)
    		{
   
    			ap.owner = false;
    		}
    	}
    	Auto_ptr<T> & operator = (const Auto_ptr & ap)
    	{
   
    		if (this != &ap)
    		{
   
    			
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值