首页 > 其他分享 >std::make_shard 和 new 的比较

std::make_shard 和 new 的比较

时间:2024-03-31 17:11:48浏览次数:28  
标签:std 对象 make 内存 shared new

std::make_sharednew 都用于动态分配内存并返回指向该内存的指针,但它们之间有一些重要的区别。下面详细解释它们之间的差异:

  1. 内存分配方式:

    • std::make_shared:该函数是一个模板函数,会在内存中分配一块足够大的内存来存储对象及其控制块(用于跟踪引用计数等信息),然后在此内存上构造对象。因此,std::make_shared 一次性完成了内存分配和对象构造。
    • new:使用 new 运算符动态分配内存时,会首先分配足够的内存来存储对象,并返回指向该内存的指针。然后,必须显式地调用构造函数来在该内存上构造对象。
  2. 性能:

    • std::make_shared 通常比直接使用 new 更高效,因为它只需一次内存分配和一次构造函数调用。而使用 new 则需要两次内存分配(对象内存和控制块内存)和一次构造函数调用。
    • 另外,std::make_shared 还可以减少内存碎片化,因为它在一次分配中为对象和控制块分配了连续的内存。
  3. 异常安全性:

    • std::make_shared 在内存分配和对象构造过程中提供了强异常安全性。如果在分配内存或构造对象时抛出异常,std::make_shared 会自动处理已分配的内存,确保没有内存泄漏,并且不会部分构造对象。
    • 使用 new 时,如果在分配内存后抛出异常,可能会导致内存泄漏,因为在异常抛出前分配的内存无法释放。
  4. 代码简洁性:

    • std::make_shared 可以使代码更加简洁,因为它结合了内存分配和对象构造,并且不需要指定对象的类型(由模板参数推导)。
    • 使用 new 时,需要显式地指定对象类型,并且需要两步操作:分配内存和构造对象。

综上所述,优先使用 std::make_shared 来动态分配对象,因为它在性能、异常安全性和代码简洁性方面都有优势。只有在特定情况下(例如需要控制对象和控制块的内存分配)才考虑使用 new

标签:std,对象,make,内存,shared,new
From: https://www.cnblogs.com/music-liang/p/18106949

相关文章

  • NewStarCTF(Reserve) WEEK1
    easy_RE咳有UPX壳,先脱壳enc="gmbh|D1ohsbuv2bu21ot1oQb332ohUifG2stuQ[HBMBYZ2fwf2~"flag=''foriinenc:b=(ord(i)-1)flag+=chr(b)print(flag)#flag{C0ngratu1at10ns0nPa221ngTheF1rstPZGALAXY1eve1}Segmentssegments用sh......
  • a new idea
    RD性能:结合图像重压缩的MLCC模型以及自编码器中的注意力机制TheDevilIsintheDetails:Window-basedAttentionforImageCompression(全注意力机制可以换成ViT)JointGlobalandLocalHierarchicalPriorsforLearnedImageCompression(CNN+Transfomer)做剪枝impor......
  • NewStarCTF-thirdweek
    一、阳光开朗大男孩1.题目给出了secret.txt和flag.txt两个文件,secret.txt内容如下:法治自由公正爱国公正敬业法治和谐平等友善敬业法治富强公正民主法治和谐法治和谐法治法治公正友善敬业法治文明公正自由平等诚信平等公正敬业法治和谐平等友善敬业法治和谐和谐富强和谐富强和谐......
  • NewStarCTF-secondweek
    一、新建Word文档1.doc文档隐写,将如图所示的设置打开,即可看到文字。2.新佛曰加密,在线网站解密。(http://hi.pcmoe.net/buddha.html)二、永不消逝的电波1.附件是个音频,audacity打开,可以看到明显的长短波。2.莫斯密码解密即可。源报文:..-./.-../.-/--./-/...././-..././.../......
  • NewStarCTF-fourthweek
    一、R通大残下载附件后发现图片最上面有一行色块:编写脚本提取出第一行像素色块的RGB值:fromPILimportImageimage=Image.open('secret.png')pixels=image.load()width,height=image.sizeforxinrange(width):r,g,b=pixels[x,0]print(f"......
  • NewStarCTF-firstweek
    一、Crypto-brainfuck1.附件内容如下。++++++++[>>++>++++>++++++>++++++++>++++++++++>++++++++++++>++++++++++++++>++++++++++++++++>++++++++++++++++++>++++++++++++++++++++>++++++++++++++++++++++>++++++++++++++++++++++++>+++++......
  • NewStarCTF-fifthweek
    一、隐秘的图片给出了两张图片,像是二维码,但是其中一张图片是损坏的,因此想到使用Stegsolve对两张图片进行异或:异或得到一张新的二维码,扫描获得Flag:二、ezhard拿到文件之后发现是硬盘格式文件新建目录挂载flag在hint.png三、新建Python文件pyc文件隐写很容易就能找......
  • 使用 wsl+makefile+clangd编辑stm32代码环境的搭建
    使用wsl+makefile+clangd编辑stm32代码环境的搭建安装wsl环境可以看看下面的文章安装与换源都提及,相信大家可以安装成功的https://www.cnblogs.com/banmei-brandy/p/16218660.html安装make、bear、clangd、arm-none-eabi-gcc、最新的构建库sudoaptinstallmakebearclang......
  • 获取std::exception_ptr指向的异常信息
    1、产生std::exception_ptr的方式:std::exception_ptrptr=nullptr;//用来保存异常信息try{test();}catch(...){std::exception_ptrptr=std::current_exception();//这是exeception_ptr产生的地方}或std::exception_ptrptr2......
  • 前端面试手写题目|编写一个函数,实现对象深拷贝,递归引用,日期,正则symbol健。手写Object.
    快速,选择,希尔45,编写一个函数,实现对象深拷贝,并解决递归引用,日期,正则表达式,对象中含有symbol健等问题。functiondeepCopy(obj,cache=newWeakMap()){if(obj==null||typeofobj!=='object'){r......