您的位置:首页 > 编程语言 > C语言/C++

20170911_C++11新特性之智能指针

2017-09-11 22:50 148 查看
20170911_C++11新特性之智能指针

参考博客:http://blog.csdn.net/weizhengbo/article/details/68957993


1、 什么是智能指针?

2、为什么要用智能指针以及智能指针的原理是什么?

3、分析下常见的智能指针有哪些?

4、实现一个智能指针呗?

解答问题1:什么是智能指针?

1、

(1)智能指针是模板类,它用来生成这样一些指针,这些指针指向的是动态分配的堆内存中的对象,它就是用来管理动态对象的,用于动态对象的生存期的控制,能够确保自动的正确的销毁动态对象,在动态对象使用完毕之后,通过自动调用智能指针模板类的析构函数来释放动态对象内存,以防止内存泄漏的发生。

(2)它的一种通用的实现技术就是使用“引用计数”机制。智能指针类把一个计数器和类(模板类对象就是一个智能指针,这个智能指针指向的就是动态对象)指向的动态对象相关联,引用计数跟踪这个类有多少个对象共享同一指针。

(3)每次创建一个智能指针类的新对象(该对象就是智能指针)时,初始化智能指针并将引用计数值置为1。当该对象作为另一个对象的副本而被创建时,拷贝构造函数 将会智能指针并增加与之相应的引用计数;当该对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果这时引用计数减少到0,就删除智能智能指向的动态对象),并增加右操作数所指对象的引用计数;调用析构函数时,析构函数将减少引用计数(如果这时引用计数减少到0,就删除智能智能指向的动态对象)。

回答问题2:为什么要用智能指针以及智能指针的原理是什么?

2、

为什么要用啊?

(1)手动使用malloc 函数或者new 运算符创建出来的动态内存,很容易在该动态内存不再需要使用的时候或者程序退出的时候忘记调用free 函数或者delete 运算符释放掉,造成内存泄漏。

(2)当程序中途抛出异常时,无法释放动态资源。

比如:

int *p1=new int;
int *p2=new int[1000000];
detele p1;
detele [] p2;由于p2申请的内存太大,万一申请失败,在第二句时就抛出异常了,则会导致抛p1指向的内存永远无法被释放掉,内存泄漏了。
简述下智能指针的原理:

(1)为了解决上述问题,创建一份动态资源出来的时候,把它交给一个类对象去管理,当类对象的声明周期结束后,自动调用类对象的析构函数去释放此动态资源。(通过类对象的私有数据成员“ 引用计数 ”来判断其声明周期是否结束!

(2)通过运算符重载,比如重载 “ * ” 或者重载 “ -> ”, 可以使得类对象可以像指针一样使用。

回答问题3: 分析下常见的智能指针有哪些?

3、

回答问题4:实现一个智能指针呗?

4、
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: