目录
接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧
一:智能指针的必要性
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)是一种利用对象生命周期来控制程序资源(如内
存、文件句柄、网络连接、互斥量等等)的简单技术
在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在
对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做
法有两大好