c++修炼之路之智能指针

目录

一:智能指针的必要性 

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

三:智能指针的使用及原理

1.RAII

2.智能指针的原理

3.底层实现 

四:内存泄露 

接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧 

一:智能指针的必要性 

int div()
{
	int a, b;
	cin >> a >> b;
	if (b == 0)
		throw invalid_argument("除0错误");
	return a / b;
}
void Func()
{
	// 1、如果p1这里new 抛异常会如何?
	// 2、如果p2这里new 抛异常会如何?
	// 3、如果div调用这里又会抛异常会如何?
	int* p1 = new int;
	int* p2 = new int;
	cout << div() << endl;
	delete p1;
	delete p2;
}
int main()
{
	try
	{
		Func();
	}
	catch (exception& e)
	{
		cout << e.what() << endl;
	}
	return 0;
}

这里对于p1这里new抛异常时,会在main函数中捕获到异常进行处理,Func函数后面的代码不再执行,这里还不会出现啥问题的,如果是p2这里new抛异常时,也会在main函数中捕获到异常进行处理,此时后面的代码不再执行,造成p1没有释放,即内存泄露,对于div调用时抛异常,p1和p2都没有释放也造成内存泄露。因此对于抛异常时,对于动态申请的数据是很难做到全部释放,不会内存泄露的,此时就可以使用智能指针来解决上述问题

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

1. C++ 98 中产生了第一个智能指针auto_ptr.
2. C++ boost给出了更实用的scoped_ptr和shared_ptr和weak_ptr.
3. C++ TR1,引入了shared_ptr等。不过注意的是TR1并不是标准版。
4. C++ 11,引入了unique_ptr和shared_ptr和weak_ptr。需要注意的是unique_ptr对应boost
的scoped_ptr。并且这些智能指针的实现原理是参考boost中的实现的。

三:智能指针的使用及原理

1.RAII

RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内
存、文件句柄、网络连接、互斥量等等)的简单技术

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值