您的位置:首页 > 职场人生

面试总结

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(), 则只会分配一次内存,将这个控制块直接放在对象的后边,所以效率高



基于安全性的考量

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() 函数发生了异常,就会发生内存的泄漏。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: