首页 > 其他分享 >make_shared与shared_ptr

make_shared与shared_ptr

时间:2024-06-05 09:33:30浏览次数:20  
标签:make 内存 new shared ptr 指针

在 C++11 中,提供了 make_shared 函数来创建共享指针,它的底层是一个模板函数,可以接受任何类型的参数,并返回一个指向该类型对象的共享指针。

std::shared_ptr<T> make_shared< T >( Args&&... args );

特点

它可以将控制块和对象一起分配在堆上,从而避免了两次内存分配,并减少了引用计数的内存开销,shared_ptr 会进行两次new,一个是存放对象,另一个用来存放强智能指针以及肉智能指针的引用计数,所以make_shared相对于直接使用 new 或 shared_ptr 更为高效。

优点

  1. 内存分配效率高,只需要new一块出来;
  2. 防止内存泄漏的风险,针对shared_ptr,如果第一块内存开辟成功,但是引用计数的内存开辟失败,也就是对象创建失败了,这样就会造成资源泄漏的问题;

缺点

  1. make_shared无法自定义删除器,默认的是delete操作,对于文件等资源是不能使用delete的,而使用shared_ptr可以自定义删除器;
  2. 在make_shared会导致托管的资源延迟释放,即就是现在没有强智能指针指向资源了,资源也无法释放,因为两者是一块内存,要释放是一起释放的。在 shared_ptr中只要所有的强智能指针全部出作用域了,资源例如new int(10)一定会马上进行释放,不在意弱智能指针是否在观测,当弱智能指针也不再观测的时候会释放第二块内存,这对于内存要求高的场景来说, 是一个需要注意的问题。

类似的:unique_ptr(不带引用计数的)C++11提供了make_unique来代替它。

标签:make,内存,new,shared,ptr,指针
From: https://blog.csdn.net/m0_73537205/article/details/139440603

相关文章

  • 巧用CMake编译策略:C++二次开发中的Release与Debug模式切换秘籍
    往期本博主的C++精讲优质博文可通过这篇导航进行查找:《Lemo的C++精华博文导航:进阶、精讲、设计模式文章全收录》前言在C++二次开发的过程中,理解各种编译模式并能灵活切换,对于提升软件性能和调试效率至关重要。本文将深入讨论Debug与Release模式的区别、默认编......
  • CMakeFile.txt通过sysroot方式后生成makefile报错
    怪不得博客园干不过别家,体验真的不太好。通过openwrite发布文章,其他平台都能发布,就博客园限制了,理由是文字少的文章限制发布到该平台。哎,这种行为当真是扶不起的阿斗。以后也不要太把博客园当回事了,迟早要关门的报错信息如下:--TheCcompileridentificationisunknown--T......
  • CMake -- CMake Release 编译
    1.Release和Debug的区别Debug:调试版本,包含了调试需要用到的信息,程序员可以通过这个版本对程序进行调试。通常有一个.pdb格式的文件,包含了断点等调试信息。Release:发布版本,不对程序进行调试,自然就比Debug版本容量更小。同时在编译时会对程序进行优化,速度也比Debug更快。......
  • 【ARM-Linux篇】Makefile入门
    一、编译工具及构建工具介绍make的出现是为了解决手动编译和链接大型工程的问题,它可以避免重复的工作,提高效率,保证正确性。make工具就根据makefile中的命令进行编译和链接的。但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改,因此更高级......
  • UE中的TStrongObjectPtr
    TStrongObjectPtr是UnrealEngine中的一种智能指针类型,用于管理UObject派生类对象的生命周期。它通常用于确保一个指向UObject的指针在其使用期间不会被垃圾回收系统销毁。TStrongObjectPtr的作用和特点:生命周期管理:TStrongObjectPtr持有UObject的强引用,确保在TStr......
  • PostgreSQL启动报错“could not map anonymous shared memory: Cannot allocate memor
    PostgreSQL启动报错“couldnotmapanonymoussharedmemory:Cannotallocatememory”基础信息OS版本:RedHatEnterpriseLinuxServerrelease7.9(Maipo)DB版本:16.2pg软件目录:/home/pg16/softpg数据目录:/home/pg16/data端口:5777报错[pg16@test~]$pg_ctlst......
  • 报错信息:Unable to make field private final java.lang.Class java.lang.invoke.Seri
    jdk版本与当前MyBatisPlus版本不兼容解决方法:1.升级MyBatisPlus的版本。2.或者使用以下方法--add-opensjava.base/java.lang.invoke=ALL-UNNAMED......
  • cmake配置VS工程配置使用dll
    cmake配置VS工程配置使用dllAuthor:ChrisZZTime:2024-06-0116:17:04目录cmake配置VS工程配置使用dll1.目的2.如果找不到dll,会发生什么?3.需要找到哪些dll?3.1“就那么几个文件,手动拷贝“3.2从依赖树递归查询3.3额外的dll文件4.找到dll后放到哪里?4.1VS工程属性......
  • 【Linux】如何利用linux项目自动化构建工具-make/Makefile以及vim编辑器构建两个小程
    1.倒计时小程序首先我们Linux中创建目录test1,该目录中包含了makefile文件,和main.c文件(该文件是源文件用于编写倒计时程序的代码)再进行依赖方法和依赖关系的确定: 利用vim编辑器编辑makefile文件:注意:在依赖方法前面加@的作用是,执行make指令后,将对应的依赖方法不显示在屏幕......
  • Qt 设置软件的版本信息:QMake、CMake工程
    Qt设置软件的版本等信息对于Qt开发的软件,我们如何去方便的查看其软件的版本信息。这里提供了几种方式。在运行程序期间设置版本信息大部分的程序在运行之后都会提供一个关于的按钮,通过点击该按钮并弹出一个关于界面,则可以查看相关的程序信息。此关于界面为用户自定义的......