解析Boost库智能指针(smart pointer)实现原理

本文探讨了Boost库中的智能指针,包括auto_ptr、shared_ptr和scoped_ptr(uniqued_ptr),解释了它们的设计理念和实现原理。通过分析auto_ptr的缺陷及其解决方案,展示了shared_ptr在处理循环引用时的智能管理,以及scoped_ptr的独占性资源管理,强调了在C++程序中避免内存泄漏的重要性。
摘要由CSDN通过智能技术生成

引言:

我们在写c++程序的时候,经常会因为忘记释放指针的资源从而导致内存泄漏,基于指针的这种缺陷,boost库中就提供了一种称之为“Smart Pointer"的类来解决这个问题,让程序自己控制已经不需要的资源的释放。后来”Smart Pointer”中的部分也移植到了c++标准库。

下面这些smart pointer的设计思想都是:定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,然后在析构函数完成资源的清理,由于在在作用域结束的时候会自动调用析构函数,所以就起到了资源自动释放的效果。

auto_ptr

智能指针的实现都采用了泛型的思想,即可以用来操作任何类型的数据:内置类型,自定义。所以采用了模板类的实现方案作为框架。

因为智能指针要满足指针的一切操作,所以需要在内部实现->*=等运算符的重载。基于以上这些思路,我们就足以实现一个最初版本的auto_ptr

  • 最初版本的auto_ptr
template<typename T>
class AutoPtr{
   
public:
	AutoPtr(T *p = NULL)
		:_ptr(p)
	{
   }
	AutoPtr(const AutoPtr<T> &a){
   
		_ptr = a._ptr;
	}
	Auto<T>& operator=(const AutoPtr<T> &a){
   
		if (this != &a){
   
			_ptr = a._ptr;
			a._ptr = NULL;
		}
	}
	T& operator*(){
   
		return *_ptr;
	}
	T& operator*(){
   
		return *_ptr;
	}
	T* operator->(){
   
		return _ptr;
	}
	~AutoPtr(){
   
		if (_ptr){
   
			delete _ptr;
		}
	}
private:
	T *_ptr;
};

缺陷: 无法用多个指针操作同一块空间。
为了避免这个缺陷,我的解决思路是这样的:
提供一个当前标签,每一块空间只有一个指针拥有当前标签,而其他的指向这块空间的指针都具有使用权,在调用析构函数的时候,只有释放的指针具有当前标签的,才真正释放指针所指向的空间资源,这样就解决了上面的问题。

优化后的auto_ptr:

template<typename T>
class AutoPtr
{
   
public:
	AutoPtr(T *ptr = NULL) :
		_ptr(ptr
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值