面试总结
来源:互联网 发布:tcp网络编程linux 编辑:程序博客网 时间:2024/06/06 14:17
百度面试完第二天,等待消息中。
面试官问的一个关于智能指针的问题是为什么使用make_shared() 比 直接用new 来构造shared_ptr智能指针要好。我想,要好,无非考虑的方面一是速度的考量,还有就是安全性的考量。当时并不知道具体细节,只记得在C++11里还有另外的几个make函数: make_pair() , make_tuple(). C++14中还有一个make_unique()
shared_ptr 内部实现实际上一共有两个指针,一共用来管理在堆上创建的对象,还有一个是额外的开销,用来指向一个控制块,这个控制块也是在堆上创建,用来保存所管理对象的强引用计数,弱引用计数,配置器和删除器什么的。
(此图来自 effective modern C++)
所以每次用new 来直接构造一个shared_ptr 对象,会在堆上分配两次内存,所以效率比较低:
但是,如果用make_shared(), 则只会分配一次内存,将这个控制块直接放在对象的后边,所以效率高
基于安全性的考量
processWidget(std::shared_ptr<Widget>(new Widget), // potentialcomputePriority()); // resource// leak!在运行期,函数的函数必须先计算然后才进行函数调用,不过对于参数的计算顺序,是没有保证的。
在这里,上边可能
1.表达式"new Widget"必须先计算,一个Widget对象必须先创建在堆上;
2.负责new出来的对象指针的std::shared_ptr<Widget>的构造函数必须执行;
3.computePriority() 必须运行。
当然也有可能顺序是这样的:
1.执行“new Widget”;
2.执行computePriority();
3.调用std::shared_ptr构造函数。
所以这里如果,computePriority() 函数发生了异常,就会发生内存的泄漏。
0 0
- 【面试】第一次面试总结
- 面试总结
- 面试总结
- 面试总结
- 面试总结
- 面试总结
- 面试 总结
- 面试总结
- 面试总结
- 面试总结
- 面试总结
- 面试总结
- 面试总结
- 面试总结
- 面试总结
- 面试总结
- 面试总结
- 面试总结
- 蓝懿学习之tableView
- [Android 硬件] Eclipse错误:Conversion to Dalvik format failed with error 1
- 第9章 异常
- Spatial Pyramid Matching for Recognizing Natural Scene Categorie(阅读)
- 【Code Forces 320A】【二进制拆分】Raising Bacteria 细胞繁殖 每天倍增
- 面试总结
- POX安装和部分配置
- c语言小工具
- HDU 4424 - Conquer a New Region(最大生成树)
- 前端笔试题
- Redis学习10之Jedis连接redis和使用
- Dev-C++制作dll文件供Visual Basic调用程序
- 光线追踪技术 第二章
- jQuery404秒倒计时