在以下情况下创建std::shared_ptr
viastd::make_shared
可能很有用:
boo(std::shared_ptr<Bar>(new Bar), foo());
foo
如果抛出异常,这里可能会有泄漏,并且
boo(std::make_shared<Bar>(), foo());
消除内存泄漏。
问题:一般来说,例如
std::shared_ptr<Bar> pBar(new Bar);
好用new
还是好用std::make_shared
?
来自 Scott Meyers - “Efficient and Modern C++11/14”(第 4.4 章):
它在那里写得很详细(我建议阅读它),但以防万一
将有 2 个内存分配:一个用于
new Bar
,另一个用于智能指针控制块。在这种情况下
可以进行一次选择,然后将对象放置
Bar
在智能指针的控制块中。这样,内存分配的数量可以减少到一个。进入可执行文件的具体内容取决于编译器优化。
总的来说,作者建议: