面试总结
2015-09-17 16:29
495 查看
百度面试完第二天,等待消息中。
面试官问的一个关于智能指针的问题是为什么使用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(), 则只会分配一次内存,将这个控制块直接放在对象的后边,所以效率高
基于安全性的考量
在这里,上边可能
1.表达式"new Widget"必须先计算,一个Widget对象必须先创建在堆上;
2.负责new出来的对象指针的std::shared_ptr<Widget>的构造函数必须执行;
3.computePriority() 必须运行。
当然也有可能顺序是这样的:
1.执行“new Widget”;
2.执行computePriority();
3.调用std::shared_ptr构造函数。
所以这里如果,computePriority() 函数发生了异常,就会发生内存的泄漏。
面试官问的一个关于智能指针的问题是为什么使用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), // potential computePriority()); // resource // leak!在运行期,函数的函数必须先计算然后才进行函数调用,不过对于参数的计算顺序,是没有保证的。
在这里,上边可能
1.表达式"new Widget"必须先计算,一个Widget对象必须先创建在堆上;
2.负责new出来的对象指针的std::shared_ptr<Widget>的构造函数必须执行;
3.computePriority() 必须运行。
当然也有可能顺序是这样的:
1.执行“new Widget”;
2.执行computePriority();
3.调用std::shared_ptr构造函数。
所以这里如果,computePriority() 函数发生了异常,就会发生内存的泄漏。
相关文章推荐
- 黑马程序员----便利构造器/代码块
- 黑马程序员----OC语法之简明扼要的总结二
- 黑马程序员----OC语法之简明扼要的总结一
- 《程序员面试金典》--删除链表中的某个元素(这个元素只能访问)
- 黑马程序员---OC中类与对象 语法杂记
- 嵌入式C语言面试题
- 近来C#面试题目之不会系列
- 黑马程序员---浅析 宏
- 电话邦php面试题及答案
- 黑马培训---分享点干货一 IOS面试常见的专业问题
- 2015美团校招面试总结
- 从通信的角度分析一下微信推送的长连接的弊端——网易面试题
- 从通信的角度分析一下微信推送的长连接的弊端——网易面试
- iOS程序员必须知道的Android要点
- 每个程序员都应该了解的内存知识
- 心得
- 前端程序员必上的8个优秀的中文前端设计网站
- 黑马程序员——IO流(字符流)
- 黑马程序员——IO流(字节流)
- 《黑马程序员》Java 反射机制