智能指针

智能指针
当一个函数中出现大量的return,那么在每一次return前都要将new出来的变量进行delete,这种操作非常麻烦而且容易出错,还容易造成内存碎片,智能指针就是用来解决这种问题的。
智能指针是一个类模板,主要功能是假装自己是一个指针,重载解引用和 ->,通过析构函数自动释放指针,解决上面的问题。
智能指针就是更加方便,安全的使用临时new出来的变量或对象的。
1、auto_ptr C++98支持,已经废止,尽量不要使用
2、unique_ptr
3、shared_ptr
三种指针在拷贝时的区别:
1、auto_ptr 当对象拷贝或者赋值后,原来的对象就悬空了
2、unique_ptr 不允许进行拷贝和赋值
3、shared_ptr 随意拷贝。

shared_ptr的原理
是通过引用计数的方式来实现多个shared_ptr对象之间共享资源。
1、shared_ptr在其内部,给每个资源都维护了着一份计数,用来记录该份资源被几个对象共享。
2、在对象被销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象的引用计数减一。
3、如果引用计数是0,就说明自己是最后一个使用该资源的对象,必须释放该资源;
4、如果不是0,就说明除了自己还有其他对象在使用该份资源,不能释放该资源,否则其他对象就成野指针了。
weak_ptr: 解决循环引用的问题:
智能指针指向的类型里,包含同样类型的智能指针(类似链表),在这种情况,如果像链表那样赋值,就会产生循环引用。
特点:什么都没有,只能保存指针
删除器:
构造的第二个参数可以传一个仿函数,代表析构的方式

智能指针的实现(实现解引用和->的重载)

template<class T>
class SmartPtr{
	T m_ptr;
public:
	SmartPtr(T *m_ptr = nullptr) :
		m_ptr(ptr)
	{

	}

	~SmartPtr(){
		if (m_ptr){
			delete m_ptr;
		}
	}

	T & operator *(){
		return *m_ptr;
	}

	T * operator ->(){
		return m_ptr;
	}
	
	T & operator [](int i){
		return m_ptr[i];
	}
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值