当前位置:首页 > c++ > 正文内容

std::make_shared有什么好处?

xuwenyan10个月前 (05-24)c++429

为什么使用std::make_shared,std::make_shared有什么好处?
如下:

更美观的代码

std::shared_ptr<Node> ptr(new Node);
std::shared_ptr<Node> ptr = std::make_shared<Node>();

更高的效率

std::shared_ptr<Node> ptr(new Node);

上面的代码存在两次内存分配

1:new Node

2:为ptr分配控制块的内存用于存放引用计数等信息

如果使用std::make_shared只会存在一次内存分配,因为它会一次性申请足够大的空间用于存储Node和控制块

更安全的代码

void fun(const std::shared_ptr<Node>& node1, const std::shared_ptr<Node>& node2){
   // TODO
}
func(std::shared_ptr<Node>(new Node), std::shared_ptr<Node>(new Node));

上面的代码执行顺序很有可能是

1:new Node

2:new Node

3:std::shared_ptr赋值

4:std::shared_ptr赋值

因此,如果在第二次new Node时发生异常,此时第一次的Node因还未来得及赋值给std::shared_ptr造成了内存泄漏。

正确的做法是

fun(std::make_shared<Node>(), std::make_shared<Node>());
    文章作者:xuwenyan
    版权声明:本文为本站原创文章,转载请注明出处,非常感谢,如版权漏申明或您觉得任何有异议的地方欢迎与本站取得联系。

    扫描二维码推送至手机访问。

    版权声明:本文由艺文笔记发布,如需转载请注明出处。

    本文链接:https://www.xuwenyan.com/archives/2756

    分享给朋友:

    “std::make_shared有什么好处?” 的相关文章

    uafxcwd.lib(afxmem.obj) : error LNK2005:

    uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)"解决办法

    如果在编译MFC程序的时候出现下列及类似的错误: 1˃uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) 已经在 LIBCMTD.lib(new...

    C++ 获取进程所在目录(进程全路径)

    C++ 获取进程所在目录(进程全路径)

    打开windows任务管理器,会看到很多的进程在运行,随机挑选一个,如何通过c++代码获取某一个进程的所在全路径呢?这也是在windows软件开发中经常遇到的需求。通过进程名获取进程全路径由于可能很多进程叫同一个名字,所以获得的结果也有可能是多个#include <windows.h...

    c++函数模板参数类型限定

    c++函数模板参数类型限定

    函数模板函数模板可以实现对不同数据类型做统一操作,比如比较两个数据的大小:template<typename T> bool compare(T& a,T& b) {   return a...

    static_assert和assert有什么区别?

    static_assert和assert有什么区别?

    static_assert和assert都是断言,都可用于判断一个条件是否成立,并且在条件不成立时及时给出错误提示。那它们用什么不同和需要注意的地方呢? 1:static_assert在编译期执行,而assert在运行期执行。2:static_assert无论在debug模式还是relea...

    c++为什么不能在构造函数里调用虚函数?

    c++为什么不能在构造函数里调用虚函数?

    c++为什么不能在构造函数里调用虚函数? c++的构造顺序先构造父类,然后构造子类,析构顺序相反。 如果在构造函数调用虚函数,例如:ClassB继承于ClassA,如果在ClassA的构造函数里调用虚函数,此时因为ClassB并没有构造,所以ClassB的成员都没有初始化,如果编译执行...

    堆和栈有什么区别?哪个比较快?

    堆和栈有什么区别?哪个比较快?

    我们都知道,windows内存区域无外乎堆、栈、静态区、常量区,下面主要说一说堆和栈。 首先我们要注意一个容易混淆的点,我们经常会听人把堆栈连起来说,通常堆栈指的是栈,而不是堆。 什么是堆? 需要程序员自己申请,并指明大小。 什么是栈? 由编译器自动分配释放 ,存放为...