首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

详解 C++ 11 中的智能指针

正因为 std::auto_ptr 的设计存在如此重大缺陷,C++11 标准在充分借鉴和吸收了 boost 库中智能指针的设计思想,引入了三种类型的智能指针,即 std::unique_ptr、std:...boost 还有 scoped_ptr,C++11 并没有全部照搬,而是选择了三个最实用的指针类型。...行打印的引用计数为 1; 程序执行到 39 行以后,sp1 出了其作用域被析构,在其析构时递减资源 A 的引用计数至 0,并析构资源 A 对象,因此类 A 的析构函数被调用。...所以整个程序的执行结果如下: [root@myaliyun testmybook]# ....std::weak_ptr 的应用场景,经典的例子是订阅者模式或者观察者模式中。这里以订阅者为例来说明,消息发布器只有在某个订阅者存在的情况下才会向其发布消息,而不能管理订阅者的生命周期。

2.8K31

智能指针--C++

一、智能指针的使用场景分析 下面程序中我们可以看到,new了以后,我们也delete了,但是因为抛异常导,后面的delete没有得到执行,所以就内存泄漏了,所以我们需要new以后捕获异常,捕获到异常后delete...,因为仿函数类型构造的对象直接就可以调⽤ // 但是下⾯的函数指针和lambda的类型不可以 unique_ptr> up2(new Date[5])...auto_ptr的思路是拷贝时转移资源管理权给被拷贝对象,这种思路是不被认可的,也不建议使用。unique_ptr的思路是不支持拷贝。...,也不支持访问资源,所以我们看文档发现weak_ptr构造时不支持绑定到资源,只支持绑定到shared_ptr,绑定到shared_ptr时,不增加shared_ptr的引用计数,那么就可以解决上述的循环引用问题...八、内存泄漏 1、什么是内存泄漏,内存泄漏的危害 什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存,一般是忘记释放或者发生异常释放程序未能执行导致的。

4500
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++】智能指针

    如果Division抛异常了,sp1,sp2出了作用域,就调用析构函数释放。如果sp2出异常了,sp1出了作用域也会释放。 总结一下智能指针的原理: 1. RAII特性 2....如上图,unique_ptr不支持拷贝构造。...如果想获取原生指针,也是可以获取的。通过get成员函数即可。 还可以调用 operator-> 如果是多个对象,可以用 类型[] 实例化。...make_shared和make_pair的使用一样,构造后返回一个对象。 模拟shared_ptr 如上图,同一个类型的模板,对应的资源不同,对应的引用计数也要不同。...系统资源泄漏: 指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。

    8710

    一文彻底掌握智能指针!

    ,因此 A 的构造函数会执行。...程序执行到 36 行以后,sp3 出了其作用域被析构,资源 A 的引用计数递减 1,因此 代码 38 行打印的引用计数为 1。...程序执行到 39 行以后,sp1 出了其作用域被析构,在其析构时递减资源 A 的引用计数至 0,并析构资源 A 对象,因此类 A 的析构函数被调用。...std::weak_ptr 的应用场景,经典的例子是订阅者模式或者观察者模式中。这里以订阅者为例来说明,消息发布器只有在某个订阅者存在的情况下才会向其发布消息,而不能管理订阅者的生命周期。...作为类成员变量时,应该优先使用前置声明(forward declarations) 我们知道,为了减小编译依赖加快编译速度和生成二进制文件的大小,C/C++ 项目中一般在 *.h 文件对于指针类型尽量使用前置声明

    1.5K30

    Postgresql源码(122)Listen Notify与事务的联动机制

    所有的通知消息都被放置在队列中,稍后由监听的后端进程读取。没有集中的信息知道哪个后端进程监听哪个通道;每个后端进程都有自己感兴趣的通道列表。...虽然只有一个队列,但通知被视为数据库本地的;这是通过在每个通知消息中包含发送者的数据库 OID 来实现的。监听的后端进程会忽略不匹配其数据库 OID 的消息。...最后,在完全退出事务并即将进入空闲状态时,我们会扫描队列中需要发送到前端的消息(可能是来自其他后端的通知,或者是自己发送的通知)。...这是相对昂贵的操作(特别是,它需要一个独占锁),因此我们不希望经常执行。如果发送后端将队列头推进到新页面,则会执行此操作,但每QUEUE_CLEANUP_DELAY页只执行一次。...一个在相同频道上监听的应用程序将会收到自己发送的NOTIFY消息。如果这些消息对应用程序没有用处,可以通过将NOTIFY消息中的be_pid与应用程序自身后端的PID进行比较来忽略它们。

    26310

    slurm--大型集群管理指南

    性能表现 以下时间是执行MPI程序打印 "Hello world "并退出的时间,包括处理输出的时间。由于硬件、软件和配置的不同,你的性能可能会有所不同。...线程/进程限制 在SLES 12 SP2中,有一个新引入的限制(用于Cray系统的CLE 6.0UP04,将于2017年中发布)。...随SLES 12 SP2一起发行的systemd版本包含对PIDs cgroup控制器的支持。在新的systemd版本下,每个init脚本或systemd服务默认限制为512个线程/进程。...[Service] TasksMax=N 注意:早期版本的systemd不支持PIDs cgroup控制器,因此忽略了TasksMax的设置。...为了将这种消息流量分散到不同的时间,避免消息丢失,可以使用EpilogMsgTime参数。注意,即使消息丢失,也会被重新传送,但这将导致重新分配资源给新作业的延迟。

    2.1K20

    详解FIX协议的原理、消息格式及配置开发

    FIX协议不支持单个消息的确认。...如果 之前收到该订单,应以执行报告消息回应订单状态。如果之前未收到,则以执行报告消息回应订单确认。...N 委托方的机器网络信息 标准消息尾 Y 执行报告消息(MsgType=8) 订单确认 订单状态变化确认(如撤单确认) 发送订单的成交回报 订单拒绝 Tag 域名 必需 说明 标准消息头 Y...最近一笔成交价格) 30 LastMkt N 上一成交市场 151 LeavesQty Y 订单剩余数量 14 CumQty Y 成交总数 6 AvgPx Y 成交平均价 60 TransactTime N 执行报告时间...Y 订单状态请求消息(MsgType=H) 订单状态请求用于向交易服务方请求某订单的状态,交易服务方通过执行报告消息返回订单状态。

    8.6K41

    C++智能指针

    ✈️内存泄漏分类 程序中一般我们关心两种方面的内存泄漏: 堆内存泄漏(Heap leak) 堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一块内存...系统资源泄漏 指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。...这里的引用计数在类内实现起来不能直接使用int类型,因为如果直接使用一个局部变量这样每一个对象都会拿到一份引用计数,而我们的 目的是 每个资源都配有一个引用计数。   ..., sp3共用同一份资源,现在只有sp2, sp3共用同一份资源,而sp1与sp4共用同一块资源,那么如此,sp2与sp3的引用计数应与sp1与sp2的引用计数相同,都为2。...也就是说weak_ptr不参与资源的管理,不支持T*指针去初始化,也没有析构函数,其作用就像是对shared_ptr特殊场景做特殊管理的智能指针类。

    9010

    C++:智能指针

    一、智能指针的使用及原理 1.1 为什么需要智能指针 在学习异常的时候,我们知道了由于异常的反复横跳可能会导致内存泄露的问题,但是对于一些自定类类型来说他在栈帧销毁的时候会去调用对应的析构函数...1.2 RAII 一些指针必须手动去释放内存,但是如果我们将这个指针变成自定义类型,他会在栈帧销毁的时候去调用对应的析构函数。RAII就是大致的这种思想。...(sp1); } 1.6 shared_ptr 但是unique_ptr本身不支持拷贝,所以C++11中又提供更靠谱的并且支持拷贝的shared_ptr shared_ptr的原理:是通过引用计数的方式来实现多个...(1)int类型的成员变量或者静态成员变量(错误) (2)设成int*成员变量并指向堆区的一块空间(正确) 易错点2:拷贝构造的注意事项 template class shared_ptr...2、系统资源泄漏 指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定 3.3 如何检测内存泄漏

    11300

    【C++】智能指针的使用及其原理

    shared_ptr 和 unique_ptr 都⽀持了operator bool的类型转换,如果智能指针对象是⼀个 空对象没有管理资源,则返回false,否则返回true,意味着我们可以直接把智能指针对象给...auto_ptr ap2(ap1); // 空指针访问,ap1对象已经悬空 //ap1->_year++; unique_ptr up1(new Date); // 不支持拷贝...endl; cout _year << endl; cout _year << endl; return 0; } 通过 decltype,你可以让编译器根据给定的表达式自动推断出其类型...,因此类型推导自动完成,实参传给形参模版自动推导类型,而unique_ptr是通过类声明的方式,删除器需在模板参数中指定类型,那要么就必须要传类型,使用lambda不太方便因为lambda的类型很难获取...sp4.operator bool()) cout << "sp4 is nullptr" << endl; //不支持这样写 /* shared_ptr sp5 =

    13110

    【C++】C++的内存处理 --- 智能指针

    ,会调用sp1 sp2的析构函数,这样会让其引用计数变为1。...解决这个问题单凭shared_ptr是没有办法解决的,这里就要引入weak_ptr了: weak_ptr并不支持直接来进行管理指针资源,不支持RAII。...sp) { free(sp); }); shared_ptr sp5(new A[10], [](A* sp) {delete[] sp; }); return 0; } 这样就解决了不同类型指针释放方式不一致的问题...C/C++程序中一般我们关心两种方面的内存泄漏: 堆内存泄漏(Heap leak): 堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一块内存...系统资源泄漏: 指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。

    14310

    DLL劫持技术权限提升及防范

    DLL劫持技术权限提升及防范 Dll劫持原理介绍 DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是一种文件类型。...在程序运行中,可能会需要一些相对独立的动态链接库,而这些预先放置在系统中的动态链接库文件。当我们执行某一个程序时,相应的DLL文件就会被调用。...DLL劫持发产生大多与动态链接库加载顺序顺序有关,不同的系统查找DLL的目录以及对应的顺序略有差异,大概可以分为Windows XP SP2之前、在winxdows xp sp2之后这两种情况。...在Windows XP SP2之前,Windows查找DLL的目录以及对应的顺序如下: 进程对应的应用程序所在目录。 当前目录(Current Directory)。...MessageBoxA(0,"Thread detach",0,0); break; } return TRUE; } 将以上代码编译为DLL,当程序存在DLL劫持漏洞,调用DllMain会弹出对应的消息框

    26310

    初识C++ · 智能指针

    > s2(s1); return 0; } 当我们通过监视窗口可以看到: 执行了拷贝构造之后,s1就悬空了,相应的,s2获得了控制权,但是,属实有点鸡肋。...,这些我们应该是看一下文档就应该知道怎么使用的,这里再看看构造函数: 注意的是unique_ptr是不支持拷贝构造的,重载的第9个函数,拷贝函数被delete修饰了,所以不支持。...private: int _a1 = 1; int _a2 = 1; }; int main() { unique_ptr sp1(new A[10]); unique_ptr sp2...第一个 不能拷贝构造,第二析构会报错,因为开辟的是一个数组,基本类型是A,应该是A[],这就和定制删除器有关系了,所以这里的正确代码是: class A { public: A(int a1 = 1,..._a2++; return 0; } 这里的执行结果就是析构了十次: 为什么new了十个空间,基本类型也要是一个数组,这里的解决方案是定制删除器,先不管。

    8310

    10.Android-SharedPreferences使用

    采用xml文件形式存储在/data/data/包名/shared_prefs/下 优点在于: 轻量级,以键值对的方式进行存储,使用方便,易于理解 程序卸载后会也会一并被清除,不会残留信息 缺点在于: 不支持跨多个进程使用...Editor类下的常用方法有: Editor putInt(String key, int value); //向key键里写入int类型的值 Editor putString(String key,...String value); //向key键里写入String类型的值 Editor putStringSet(String key, Set values); //向key键里写入...Set类型的值 boolean commit(); //提交数据,写入io 4.使用3种方法生成SharedPreferences配置文件示例 写MainActivity.java的onCreate...edit2.putString("name", "test2"); edit2.commit(); //读取数据 Log.v("MainActivity","sp2

    92000

    使用西门子工控系统的注意了,已经暴露了15个安全漏洞

    网络安全研究人员披露了西门子 SINEC 网络管理系统 (NMS) 中 15 个安全漏洞的详细信息,其中一些可能被攻击者混合使用,以在受影响的系统上实现远程代码执行。...工业安全公司 Claroty在一份新报告中表示:“这些漏洞如果被利用,会给网络上的西门子设备带来许多风险,包括拒绝服务攻击、凭据泄漏和在某些情况下远程执行代码。”...值得庆幸的是,2021年10月12日,西门子在 V1.0 SP2 版本更新中解决了上述所有的安全漏洞(从 CVE-2021-33722 到 CVE-2021-33736)。...西门子在一份报告中写到,最严重的漏洞可能允许经过身份验证的远程攻击者,在某些条件下以系统特权在系统上执行任意代码。...此外,还有一个需要注意的是 SQL 注入漏洞,漏洞编号(CVE-2021-33729,CVSS 分数:8.8),通过该漏洞,经过身份验证的攻击者可以在本地数据库中执行任意命令。

    38930

    C++高级主题系列篇

    执行 try 块中的语句,如果执行的过程中没有异常拋出,那么执行完后就执行最后一个 catch 块后面的语句,所有 catch 块中的语句都不会被执行; 如果 try 块执行的过程中拋出了异常,那么拋出异常后立即跳转到第一个...“异常类型”和拋出的异常类型匹配的 catch 块中执行(称作异常被该 catch 块“捕获”),执行完后再跳转到最后一个 catch 块后面继续执行。...、不同类型的引用之间以及指针和能容纳指针的整数类型之间的转换。...转换时,执行的是逐个比特复制的操作。...A* p = new A(10);shared_ptr sp1(p), sp2(p); 问题所在: sp1 和 sp2 并不会共享同一个对 p 的托管计数,而是各自将对 p 的托管计数都记为 1

    46920

    善用shared_ptr,远离内存泄漏(文末福利)

    下面是三种常见的定义方式: shared_ptr sp;//声明一个指向int类型的智能指针 sp.reset(new int(42)); auto sp1 = make_sharedsp2 = make_shared("obj2"); auto sp1 = sp2; 该操作会减少sp1的引用计数,增加sp2的引用计数。...试想一下,sp1指向对象obj1,sp2指向对象obj2,那么赋值之后,sp1也会指向obj2,那就是说指向obj1的就少了,指向obj2的就会多,如果此时没有其他shared_ptr指向obj1,那么...拷贝 例如: auto sp2 = make_shared(1024); auto sp1(sp2); 该操作会使得sp1和sp2都指向同一个对象。...而关于拷贝比较容易忽略的就是作为参数传入函数: auto sp2 = make_shared(1024); func(sp2);//func的执行会增加其引用计数 可以看一个具体的例子: //

    1.8K10

    Sccm2012 之部署前准备

    安装SQL 2008 R2 按顺序进行安装后,选择全新的SQL功能安装。 ? 安装SQL报表服务以及所需的服务。 ? 下一步 ,选择默认实例进行安装。 ?...WSUS 3.0 SP2安装 运行WSUS 3.0 SP2安装向导,选择完整安装。 ? 选择更新存储位置,这里因为是试验环境,所以就直接选择c:\wsus了。 ?...下一步,选择创建Windows Server Update Services 3.0 SP2网站。然后下一步进行安装。 ? 完成安装,取消向导页不要进行配置。 ? 5....DC服务器准备 扩展架构,在DC服务器上运行SCCM 2012安装光盘BIN目录下I386中的extadsch.exe。执行后稍等片刻完成扩展。 ? 在根目录下查看架构扩展日志,成功扩展。 ?...添加用户,在对象类型选项中勾选计算机 ? 搜索SCCM,给予全部权限。 ? 在高级选项中,应用于这个对象及全部后代。应用,确认。 ?

    1.3K20
    领券