https://blog.csdn.net/nou_camp/article/details/70176949
C++智能指针
在正式了解智能指针前先看一下下面的一段代码
#include<iostream>
using namespace std;
class A
{
public:A():_ptr(NULL), _a(0){}~A(){}
public:int* _ptr;int _a;
};void test()
{A a;int *p1 = new int(2);
}
int main()
{test();system("pause");return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
这个代码仅从编译运行是的角度是没有问题的,但是细心看很明显这段代码是不负责任的,因为它存在内存泄漏。只是释放了_ptr,但是p1压根没释放。在这里看起来内存泄漏没有对结果造成什么,但是千万不要小瞧内存泄漏,这是个很严重的问题。如果一个特别大的项目中存在很多很多的内存泄漏问题,一开始可能没有什么问题,但是过一段时间服务器可能会挂掉,这就是内存泄漏导致内存不够用产生的。
为了解决这些问题,可以采用下面这种方法。
#include<iostream>
using namespace std;
void fun()
{throw 2;
}
int main()
{try{fun();}catch (int e){cout << e << endl;}system("pause");return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
异常对象在传给对应的catch处理后撤销。这样做是可以的,但是如果代码中有比较多的异常,这样显然不合适,大量的try catch会影响代码逻辑,导致代码丑陋不堪。为了解决这个问题,引入了智能指针。
说到智能指针,必须知道RAII
RAII:资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。智能指针只是RAII的一种应用。
智能指针:所谓智能指针就是智能/自动化的管理指针所指向的动态资源的释放。
智能指针的发展可分为三个部分,
1.auto_ptr 管理权的转移–带有缺陷的设计–c++98/03
2.scoped_ptr(boost) unique_ptr(c++11) 防拷贝 –简单粗暴的设计 –功能不全
3.shared_ptr(boost/c++11) 引用计数 –功能强大(支持拷贝,支持定制删除器) 缺陷–循环引用(可采用weak_ptr配合解决)