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

C++】————智能指针

一,什么是智能指针C++没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针(smart pointer)。...c++中用的最多的是下面三种智能指针 C++11提供了三种智能指针,使用这些智能指针时需要引用头文件 std::shared_ptr:共享的智能指针 std::unique_ptr...二,共享的智能指针shared_ptr 首先了解一下基本概念,再看代码,会学的很快 1. shared_ptr的初始化 共享智能指针是指多个智能指针可以同时管理同一块有效的内存,共享智能指针shared_ptr...std::weak_ptr没有重载操作符*和->,因为它不共享指针,不能操作资源,所以它的构造不会增加引用计数,析构也不会减少引用计数,它的主要作用就是作为一个旁观者监视shared_ptr管理的资源是否存在...std::weak_ptr没有重载操作符*和->,因为它不共享指针,不能操作资源,所以它的构造不会增加引用计数,析构也不会减少引用计数,它的主要作用就是作为一个旁观者监视shared_ptr管理的资源是否存在

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

    C++智能指针

    ,这个类可以帮我们自动析构智能指针,有效的避免了指针释放问题。...> sp2(sp1); return 0; }   而这部分也有一些C++发展历史因素,在C++std库,有一个指针叫做 auto_ptr指针,我们调用试一试: #include ...而为什么不会像auto_ptr这样犯糊涂了,这是因为这次有了先锋者,C++委员会一部分人作为先锋者,对C++一些语法做了很多的尝试,最终形成的产物就是boost库,而C++11就是吸取boost库精华的部分...unique_ptr指针   既然智能指针存在拷贝这种问题,那么就有一种简单粗暴的方法,直接禁止拷贝,而C++11确实存在这种指针,叫做unique_ptr指针,其实现如下(相似): template...C++11,shared_ptr的做法是 将每个对象存一个指向引用计数的指针

    8510

    C++智能指针

    C++智能指针 零、前言 一、为什么需要智能指针 二、内存泄漏 三、智能指针 1、RAII 2、智能指针的原理 3、std::auto_ptr 4、std::unique_ptr 5、std::shared_ptr...6、std::weak_ptr 7、删除器 8、C++11和boost智能指针的关系 零、前言 本章主要讲解学习C++智能指针的概念及使用 一、为什么需要智能指针 示例: double Division...上述的SmartPtr还不能将其称为智能指针,因为它还不具有指针的行为 指针可以解引用,也可以通过->去访问所指空间中的内容,因此模板类还得需要将***** 、**->**重载下,才可让其像指针一样去使用...}; 注:这里的模拟并不一定就是C++真真的底层实现 8、C++11和boost智能指针的关系 C++ 98 中产生了第一个智能指针auto_ptr C++ boost给出了更实用的scoped_ptr...并且这些智能指针的实现原理是参考boost的实现的

    61220

    C++智能指针

    会调用构造函数,将new int 传给类指针,对象会把指针保留起来 v1和v2属于局部对象,出了作用域时,就会调用析构函数 ,完成释放 若第一个new抛异常,就不会进入构造函数 若第二个new抛异常...拷贝问题 因为没有在类实现拷贝构造,默认是浅拷贝 ,所以就会导致释放两次,从而报错 深拷贝是不可以的,因为指针拷贝要的就是浅拷贝 链表等迭代器 结构与智能指针类似,用的是浅拷贝,为什么没有问题?...就把智能指针的问题解决了 boost 包含 scoped_ptr shared_ptr weak_ptr 体系 C++11将其吸收过来以后,将 scoped_ptr 改成 unique_ptr...---- 使用智能指针就进行释放了 ---- n1和n2作为智能指针对象,而next和prev作为原生指针 智能指针对象是没办法给原生指针的 ---- 将next和prev都转化为智能指针即可...,而_prev是随着n2节点析构而析构 就造成了循环引用,从而导致内存泄漏 ---- 库为了解决循环引用的问题,所以提出了 weak_ptr(弱指针) 特点: 不是常规的智能指针,不支持RAII(利用对象生命周期来控制程序资源

    15710

    C++智能指针

    关于内存泄漏,我也曾在C++内存管理一文写过。 为了更好的管理我们申请的空间,C++引入了智能指针。 参考文章: 1.【C++】异常_ 2. ...在封装了几层的函数抛异常,我们也能够来通过智能指针来管理好空间。 2.智能指针的完善 上述的 SmartPtr 还不能将其称为智能指针,因为它还不具有指针的行为。...但是我们发现,智能指针没有提供拷贝的功能,那么接下来我们看看库实现的智能指针是如何做的?...---- 三、标准库智能指针 1.std::auto_ptr 参考文献:std::auto_ptr auto_ptr 是C++的第一个智能指针,其在面对拷贝构造的解决办法是:转移所有权(当用当前的智能指针对象拷贝出一个新对象时...所以在我们对智能指针的资源操作的时候,我们也需要手动加锁。 C)shared_ptr的循环引用问题 虽然shared_ptr相较于以往的智能指针,表现的十分好,但是仍旧是有缺陷的。

    22720

    C++ 智能指针

    转载自:C++ 智能指针详解 简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。...,表明上述赋值成功 (*my_memory).info_extend += " other"; // 使用 operator* 返回智能指针内部对象,然后用“.”调用智能指针对象的函数...由于 std::auto_ptr 引发了诸多问题,一些设计并不是非常符合 C++ 编程思想,所以引发了下面 boost 的智能指针,boost 智能指针可以解决如上问题。 让我们继续向下看。...讲完如上 6 种智能指针后,对于一般程序来说 C++ 堆内存管理就够用了,现在有多了一种 boost::intrusive_ptr,这是一种插入式的智能指针,内部不含有引用计数,需要程序员自己加入引用计数...总结 如上讲了这么多智能指针,有必要对这些智能指针做个总结: 1、在可以使用 boost 库的场合下,拒绝使用 std::auto_ptr,因为其不仅不符合 C++ 编程思想,而且极容易出错[2]。

    1K40

    详解 C++ 11 智能指针

    我们在实际开发应该避免做出这样的逻辑设计,这种情形下即使使用了智能指针也会造成内存泄漏。也就是说一个资源的生命周期可以交给一个智能指针对象,但是该智能指针的生命周期不可以再交给整个资源来管理。...智能指针使用注意事项 C++ 新标准提倡的理念之一是不应该再手动调用 delete 或者 free 函数去释放内存了,而应该把它们交给新标准提供的各种智能指针对象。...C++ 新标准的各种智能指针是如此的实用与强大,在现代 C++ 项目开发,读者应该尽量去使用它们。...); ~Test(); private: std::unique_ptr m_spA; }; C++ 新标准智能指针我想介绍的就这么多了,Modern C/C++ 已经变为 C.../C++ 开发的趋势,希望读者能善用和熟练使用本节介绍的后三种智能指针对象。

    2.8K31

    C++智能指针

    1.智能指针的由来 C++,动态内存的管理是通过一对运算符来完成的,new用于申请内存空间,调用对象构造函数初始化对象并返回指向该对象的指针。...智能指针有时需要将其管理的对象的所有权转移给其它的智能指针,使得多个智能指针管理同一个对象,比如C++ STL的shared_ptr支持多个智能指针管理同一个对象。...C++准标准库Boost智能指针,比如boost::scoped_ptr、boost::shared_array、boost:: intrusive_ptr在这里不做研究,有兴趣的读者可以参考:C+...7.如何选择智能指针? 在掌握了上面提到的C++ STL的四种智能指针后,大家可能会想另一个问题:在实际应用,应使用哪种智能指针呢? 下面给出几个使用指南。...C++中文版(第三版).2011:61-77 [3]C++智能指针简单剖析 [4]shared_ptr基于引用计数智能指针实现 [5] C++智能指针的设计和使用 [6]C++11智能指针

    3.5K30

    C++智能指针

    为了缓解异常所引发的内存泄露问题,C++ 设计出了智能指针。...---- 二、C++ 智能指针 1、智能指针的概念 智能指针本质上是一个类,这个类的成员函数根据其功能被分为两类: RAII:RAII (资源获得即初始化 – Resource Acquisition...智能指针存在的问题 智能指针虽然能够很好的管理资源,但是智能指针的拷贝与赋值是一个很大的问题,它涉及到资源的管理权问题 – 由谁管理、由一个单独管理还是多个共同管理,我们下文学习到的几种智能指针都是围绕这个问题展开的...2、智能指针发展史 C++ 的第一个智能指针名为 auto_ptr,由 C++98 提供,但由于 auto_ptr 存在极大的缺陷,同时 C++98 的后一个大版本 – C++11 又发布的很晚,所以...3、auto_ptr auto_ptr 是 C++ 的第一个智能指针,它解决智能指针拷贝问题的方式是 管理权转移,即当用当前对象拷贝构造一个新对象时,会将当前对象管理的资源交给新对象,然后将自己的资源置空

    20730

    C++智能指针详解

    1.2 智能指针历史历程 C++ 98 中产生了第一个智能指针auto_ptr。...并且这些智能指针的实现是参照boost的实现的。 1.3 为什么需要智能指针 1.3.1 内存泄漏 我们在讲为什么之前先来了解一下什么是内存泄漏。...,在异常的重新抛出与捕获,可以用智能指针解决。...智能指针的众多版本 C++存在4种智能指针:auto_ptr,unquie_ptr,shared_ptr,weak_ptr,他们各有优缺点,以及对应的实用场景。...unique_ptr是C++11智能指针,unique_ptr来的更直接:直接防止拷贝的方式解决智能指针的拷贝问题,简单而又粗暴,防止智能指针对象拷贝,保证资源不会被多次释放,但是防止拷贝也不是解决问题的好办法

    12010

    C++ 智能指针详解

    http://blog.csdn.net/xt_xiaotian/article/details/5714477 C++ 智能指针详解 一、简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new...,表明上述赋值成功 (*my_memory).info_extend += " other";           // 使用 operator* 返回智能指针内部对象,然后用“.”调用智能指针对象的函数...由于 std::auto_ptr 引发了诸多问题,一些设计并不是非常符合 C++ 编程思想,所以引发了下面 boost 的智能指针,boost 智能指针可以解决如上问题。 让我们继续向下看。...讲完如上 6 种智能指针后,对于一般程序来说 C++ 堆内存管理就够用了,现在有多了一种boost::intrusive_ptr,这是一种插入式的智能指针,内部不含有引用计数,需要程序员自己加入引用计数...三、总结 如上讲了这么多智能指针,有必要对这些智能指针做个总结: 1、在可以使用 boost 库的场合下,拒绝使用 std::auto_ptr,因为其不仅不符合 C++ 编程思想,而且极容易出错[2]。

    1.9K10

    C++基础 智能指针

    智能指针基础原理 智能指针和普通指针的区别在于智能指针实际上是对普通指针加了一层封装机制,这样的一层封装机制的目的是为了使得智能指针可以方便的管理一个对象的生命期,实现内存的自我回收。...于是我们就想:如果是Test *t不是一个普通的指针变量,而是一个类对象的话,并且在类的析构函数实现了释放动态内存的步骤,那么只要该指针变量一退出作用域时就会调用析构函数,达到了释放动态内存的目的。...C++11智能指针 四种智能指针 C++ STL为我们提供了四种智能指针: auto_ptr( C++98提供,C++11建议弃用) 主要是用来解决**最基本**的资源自动释放问题 unique_ptr...对于特定对象,同一时刻只能有一个智能指针可拥有, 最终只有拥有对象的智能指针的构造函数会删除该对象,auto_ptr和unique_ptr就是采用这种策略 创建智能更高的指针,跟踪引用特定对象的智能指针个数...选择使用参考 如果程序要使用多个指向同一个对象的指针,那么应该使用shared_ptr 比如说现在有一个包含指针的STL容器,现在用某个支持复制和赋值操作的STL算法去操作该容器的指针元素,那么就应该用

    62020

    初识C++ · 智能指针

    ) { cout << "捕获到未知异常" << endl; } return 0; } 之前的忧虑来源于第二个抛异常之后前面的对象不会析构的问题,那么现在用一个智能指针对象来接受指针,不仅起到了管理空间的作用...现在就对智能指针有了一个简单的理解了,现在我们就深入了解一下。...1 智能指针的发展历史 提到智能指针,我们首先应该想到的是C++98里面的auto_ptr,早在C++98就引入了智能指针,但是使用确实让人一言难尽,它的本质是转移控制权,所以会导致一个悬空,像move...那么呢,在03年的时候,引入了一个库boost,这个库是由C++委员会的部分工作人员搞的,在C++11里面引入的很多新特性都是在boost里面借鉴的,其中就涉及到了智能指针,在boost里面有三种智能指针...在C++11引入智能指针的时候就借鉴了boost的智能指针,但是有一个指针改了一个名,scoped_ptr改成了unique_str,为什么改呢,咱也不知道,学就完事儿了。

    7710
    领券