本文共 1268 字,大约阅读时间需要 4 分钟。
https://blog.csdn.net/nou_camp/article/details/70176949
C++智能指针
在正式了解智能指针前先看一下下面的一段代码#includeusing 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;}
这个代码仅从编译运行是的角度是没有问题的,但是细心看很明显这段代码是不负责任的,因为它存在内存泄漏。只是释放了_ptr,但是p1压根没释放。在这里看起来内存泄漏没有对结果造成什么,但是千万不要小瞧内存泄漏,这是个很严重的问题。如果一个特别大的项目中存在很多很多的内存泄漏问题,一开始可能没有什么问题,但是过一段时间服务器可能会挂掉,这就是内存泄漏导致内存不够用产生的。
为了解决这些问题,可以采用下面这种方法。#includeusing namespace std;void fun(){ throw 2;}int main(){ try{ fun(); } catch (int e) { cout << e << endl; } system("pause"); return 0;}
异常对象在传给对应的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配合解决)