智能指针

智能指针是C++中用于避免内存泄漏的解决方案,它利用RAII技术来管理资源。C++98的auto_ptr存在拷贝问题,C++11引入了unique_ptr和shared_ptr来改进。shared_ptr通过引用计数实现资源共享,但要注意线程安全问题和循环引用。weak_ptr用于解决循环引用,而C++11的智能指针设计参考了boost库。此外,智能指针的概念也可应用于设计守卫锁以确保异常安全。
摘要由CSDN通过智能技术生成

目录

智能指针的原理:

C++98提供了auto_ptr的智能指针

c++11提供更靠谱的unique_ptr

C++11提供更靠谱的并且支持拷贝的shared_ptr

std::shared_ptr的线程安全问题

循环引用

C++11和boost中智能指针的关系

守卫锁


智能指针是一种预防型的内存泄漏的解决方案。智能指针在C++没有垃圾回收器的环境下,可以很好的解决异常安全等带来的内存泄露问题。

RAII是一种利用对象生命周期来控制程序资源的简单技术。

在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此没玩们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:

  • 不需要显示的释放资源(例如锁)
  • 对象所需的资源在其生命周期内始终保持有效。

智能指针的原理:

  1. RAII特性
  2. 重载operator*和operator->,具有指针一样的行为

C++98提供了auto_ptr的智能指针

auto_ptr的实现原理:管理权转移的思想

template<class T>
class AutoPtr
{
public:
    AutoPtr(T* ptr = NULL)
        :_ptr(ptr)
    {}
    
    ~AutoPtr()
    {
        if(_ptr)
            delete _ptr;
    }
    
    //一旦发生拷贝,就将ap中资源转移到当前对象中,然后令ap与其所管理资源断开联系
    //这样就解决了一块空间被多个对象使用而造成程序奔溃问题
    AutoPtr(AutoPtr<T>& ap)
        :_ptr(ap._ptr)
    {
        ap._ptr = NULL;
    }

    AutoPtr<T>& operator=(AutoPtr<T>& ap)
    {
        if(this != &ap)//检测是否给自己赋值
        {
            //释放当前对象中的资源
            if(_ptr)
                delete _ptr;
            //转移ap中的资源到当前对象中
            _ptr = ap._ptr;
            ap._ptr = NULL;
        }
        return *this;
    }

    T* operator*(){return *_ptr;}
    T& operator->(){return _ptr;}
private:
    T* _ptr;
};

auto_ptr缺点:拷贝后会把原来对象的指针赋空了,导致ap对象悬空,通过原来的对象访问资源时就会出现问题。

c++11提供更靠谱的unique_ptr

unique_ptr的实现原理:防拷贝

template<class T> 
class UniquePtr 
{
public:
	UniquePtr(T * ptr = nullptr)
		: _ptr(ptr)
	{}
		   
	~UniquePtr() 
	{ 
		if (_ptr)
			delete _ptr;
	}
	T& operator*() { return *_ptr; }	   
	T* operator->() { return _ptr; }
private:    
	// C++98防拷贝的方式:只声明不实现+声明成私有
	//UniquePtr(UniquePtr<T> const &);
	//UniquePtr & operator=(UniquePtr<T> const &);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值