【c++智能指针及RAII机制的理解】

一、为什么要有智能指针?

因为在平时编程过程中,极大可能会出现两种情况;
(1)malloc出来的空间,没有进行释放,存在内存泄漏;
(2)如果在malloc和free之间抛异常,那么同样存在内存泄漏问题。该问题称为异常安全问题。
使用智能指针可以解决跳出函数要频繁delete的问题,保证内存不泄漏,且通过析构函数来释放资源,使访问内存更加安全。

二、智能指针原理及使用

1、智能指针的实现是基于RAII(资源获取即初始化)。即对象在构造时获取资源,且在对象的声明周期内资源始终有效,最后在对象析构的时候释放资源。即将一份资源管理的责任交给了一个对象
2、使用RAII思想设计简单智能指针类

#include<iostream>
using namespace std;

//智能指针的简单实现
template<class T>
class SmartPtr
{
public:
	SmartPtr(T*ptr = nullptr)
		:_ptr(ptr)
	{}

	~SmartPtr()
	{
		if (_ptr)
		{
			delete _ptr;
		}
	}
	T& operator*()
	{ 
		return *_ptr; 
	}
	T* operator->()//返回指向空间的内容
	{ 
		return _ptr; 
	}
private:
	T* _ptr;
};
//使用方式

void MergeSort(int *a, int n)
{
int*tmp = (int*)malloc(sizeof(int)*n);
SmartPtr<int> sp(tmp);//把tmp指针委托给sp对象
	//……
}
//主要就是体现了智能指针可以构造时初始化,析构时释放资源

3、智能指针的原理总结

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

三、几种智能指针

库里提供的的智能指针的头文件 <memory>

1、std::auto_ptr:

缺点:拷贝构造时,会将之前的指针赋空,导致之前的指针不能再用。

auto_ptr<int>ptr(new int);
auto_ptr<int>ptr1(ptr);
//注意此时ptr失效

2、std::unique_ptr;

也是智能指针但是不支持靠拷贝(片面解决了上述auto_ptr的问题)

smart_ptr(const smart_ptr &a)=delete(default);

3、std::shared_ptr;

原理:使用引用计数的方式来实现多个shared_ptr对象之间的资源共享。
(1)shared_ptr内部,每个资源都维护了一份计数,用来记录该资源被几个对象共享;
(2)有对象销毁时,给计数减1,查看计数,为0则销毁,否则不销毁;
(3)shared_ptr的循环引用问题
两个智能指针分别指向两个结点,node1和node2;但是node1是node2的前驱,node2是node1的前驱。
在这里插入图片描述
问题: 当node1和node2析构时,分别计数减1,但是_prev和_next还分别指向对应的结点,也就是说_prev释放了,node2就释放了,_next释放了,node1就释放了。
但是,_prev和_next又分别是node1和node2的成员,所以只有node1和node2释放了,_prev和_next才会释放;
所以,谁也不会释放;
解决:把节点中的_prev和_next改成weak_ptr就可以了;因为node1->_next = node2;和node2->_prev = node1;时weak_ptr的_next和_prev不会增加node1和node2的引用计数。

4、std::weak_ptr;

不支持重载,只是看起来像一个指针而已;

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值