现在boost::make_shared已经过时了吗?

14

boost::make_shared现在已经过时了吗?我在1.35中没有找到它的定义。


2
具有讽刺意味的是,现在来这里大部分人(包括我自己)可能会想知道它是否已经过时,因为它使用的是C++11。(简短的回答是:是的,您可以使用std::版本。) - pattivacek
除非您需要保持与C++11之前的平台兼容性,否则Boost智能指针是一个非常好的选择。 - DevSolar
3个回答

30

std::make_shared也适用于C++11。请注意,make_shared不仅仅是一个方便的函数。看一下以下代码片段:

make_shared<foobar>(1, 2);
shared_ptr<foobar>(new foobar(1, 2));

这两个语句都创建了一个 foobar 对象并构造了一个 shared_ptr。但是,前者避免了为共享计数器分配内存,因为单个内存块将用于计数器和 foobar 对象。而后一种语句不可能做到这一点,因为在构造 shared_ptr 之前会先分配 foobar 的内存。

我的意思是:不,make_shared 不过时,因为它提供了非常有用的优化。


8
在 C++11 中,std::make_shared 实际上是对创建对象和创建 std::shared_ptr 的性能优化,因为它只执行一次内存分配而不是两次。 - Sean
3
另一个重要的区别是线程安全性。在第二个示例中,shared_ptr的构造函数可能会抛出异常,而由嵌套的new分配的foobar将不会被释放。 - Richard Dally

15

谢谢Ryan。有没有办法找出它是在哪个版本中引入的? - Steve
smart_ptr文档中有一个历史部分,可能会帮助您找到所需内容:http://www.boost.org/doc/libs/1_40_0/libs/smart_ptr/smart_ptr.htm#History - Ryan Cook
在这里的BUILD-windows讲座中,它被展示为现在做事情的一部分,而不是直接调用new,但我认为现在应该是std::make_shared... http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-835T - Warren P

3

今天进行了一些研究,发现 make_shared 实际上是在 1.36.0 中添加的(在 1.35.0 中没有这个头文件),但有趣的是,在 What's new 中没有单独提到这个更改 - 至少我没有找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接