argc, char *argv[]) { QCoreApplication a(argc, argv); test(); return a.exec(); } 我们通过Qt中的...NULL,防止出现悬空指针。...三、智能指针 本文以Qt中提供的智能指针为例,首先,智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象。...在上面的例子中,可以改为代码: void test() { QSharedPointer n(new BBE); n->X = 10; n->Y = 20; n...->show(); } 可以看到,使用智能指针的话,不需要手动delete内存了。
一,什么是智能指针 在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中管理的资源是否存在
,这个类可以帮我们自动析构智能指针,有效的避免了指针释放问题。...> 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的做法是 将每个对象存一个指向引用计数的指针。
目录 1.为什么需要智能指针 2.内存泄漏问题 3.智能指针的使用以及原理 ---- 1.为什么需要智能指针?...3.4 std::unique_ptr C++11中开始提供更靠谱的unique_ptr。unique_ptr看到auto_ptr的拷贝和赋值操作原本的智能指针对象悬空,那么我就不让拷贝和赋值吧!...定制删除器 在智能指针中,我们可以看到,释放资源的代码为: delete _ptr; 那如果我们的类型是一个数组,是一个文件类型,那么这种释放资源的方式很明显是不对的。...在智能指针方面: 1. C++ 98 中产生了第一个智能指针auto_ptr. 2. C++ boost给出了更实用的scoped_ptr和shared_ptr和weak_ptr. 3....并且这些智能指针的实现原理是参考boost中的实现的。
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中的实现的
什么是智能指针? 今天之前我对这个概念也很陌生,但是接触之后我便很喜欢这种指针了。 与其说是指针,不如说是一种基于指针的模板类。 智能指针存在的意义?...要创建智能指针对象,首先要包它们的头文件memory....List item 不要将 *this指针交给智能指针。...List item 不要在函数实参中创建shared_ptr function (shared_ptr (new int),g());//有缺陷 正确的写法应该是先创建智能指针: shared_ptr...p(new int()); f(p,g()); 什么时候释放智能指针?
C++智能指针 什么是智能指针 来看这段代码: #include using namespace std; int div() { int a, b; cin >> a >...boost中产生的最号的两个智能指针是scoped_ptr与shared_ptr/weak_ptr。 C++11中也就添加了unique_ptr与shared_ptr/weak_ptr。...} }; int main() { std::shared_ptr sp1(new int[10], Delete()); return 0; } C++11和boost中智能指针的关系...C++ 98 中产生了第一个智能指针auto_ptr。...并且这些智能指针的实现原理是参考boost中的实现的。
会调用构造函数,将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(利用对象生命周期来控制程序资源
关于内存泄漏,我也曾在C++内存管理一文中写过。 为了更好的管理我们申请的空间,C++引入了智能指针。 参考文章: 1.【C++】异常_ 2. ...在封装了几层的函数中抛异常,我们也能够来通过智能指针来管理好空间。 2.智能指针的完善 上述的 SmartPtr 还不能将其称为智能指针,因为它还不具有指针的行为。...但是我们发现,智能指针没有提供拷贝的功能,那么接下来我们看看库中实现的智能指针是如何做的?...---- 三、标准库中的智能指针 1.std::auto_ptr 参考文献:std::auto_ptr auto_ptr 是C++库中的第一个智能指针,其在面对拷贝构造的解决办法是:转移所有权(当用当前的智能指针对象拷贝出一个新对象时...所以在我们对智能指针中的资源操作的时候,我们也需要手动加锁。 C)shared_ptr中的循环引用问题 虽然shared_ptr相较于以往的智能指针,表现的十分好,但是仍旧是有缺陷的。
转载自: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]。
C++智能指针 为什么要使用智能指针? > p400 虽然使用动态内存有时是必要的,但众所周知,正确地管理动态内存是非常棘手的。...release返回的指针通常被用来初始化另一个智能指针或给另一个智能指针赋值。在本例中,管理内存的责任简单地从一个指针转给了另一个。...Boy()); sp_girl->set_boy_friend(sp_boy); sp_boy->set_girl_friend(sp_girl); //对象引用计数都为2 //定义的指针和类中私有属性中的指针...类中弱指针,用shared指针构造weak指针,用的时候,将weak指针转成shared指针来调用成员函数。...禁止用任何类型智能指针get 函数返回的指针去初始化另外一个智能指针!
我们在实际开发中应该避免做出这样的逻辑设计,这种情形下即使使用了智能指针也会造成内存泄漏。也就是说一个资源的生命周期可以交给一个智能指针对象,但是该智能指针的生命周期不可以再交给整个资源来管理。...智能指针使用注意事项 C++ 新标准提倡的理念之一是不应该再手动调用 delete 或者 free 函数去释放内存了,而应该把它们交给新标准提供的各种智能指针对象。...C++ 新标准中的各种智能指针是如此的实用与强大,在现代 C++ 项目开发中,读者应该尽量去使用它们。...); ~Test(); private: std::unique_ptr m_spA; }; C++ 新标准中的智能指针我想介绍的就这么多了,Modern C/C++ 已经变为 C.../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智能指针之
智能指针 一、为什么需要智能指针?...内存泄漏的分类 C/C++程序中一般我们关心两种方面的内存泄漏: 堆内存泄漏(Heap leak) 堆内存指的是程序执行中依据须要分配通过 malloc / calloc / realloc / new...智能指针的原理 上述的 SmartPtr 还不能将其称为智能指针,因为它还不具有指针的行为。...智能指针和 RAII 的关系:智能指针就是使用 RAII 这种思想的一种实现!符合 RAII 思想的不止有智能指针,还有其它的场景!..._ptr 和 n1 智能指针对象中 _ptr 指向的节点中的 next 智能指针对象中的 _ptr 都指向了同一个节点资源,所以该节点的资源的 _pcount 是 2;当 n2 出了作用域调用析构函数
因此为了解决抛异常之后可能存在的内存泄露的问题,C++提出了智能指针来解决这个问题,他的思想是RAII。下面我们将RAII来理解什么是智能指针。...(2)采用这种方式,对象所需的资源在其生命期内始终保持有效 1.3 智能指针的基本框架 既然是指针,还得像指针一样去使用,因此在模版中我们必须重载一下*和->的运算符。...fclose(ptr); });//文件 shared_ptr sp4((int*)malloc(4), [](int* ptr) {free(ptr); }); } 二、.C++11和boost中智能指针的关系及发展历史...C++ 98 中产生了第一个智能指针auto_ptr. 2. C++ boost给出了更实用的scoped_ptr和shared_ptr和weak_ptr. 3....并且这些智能指针的实现原理是参考boost中的实现的。
为了缓解异常所引发的内存泄露问题,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++ 中的第一个智能指针,它解决智能指针拷贝问题的方式是 管理权转移,即当用当前对象拷贝构造一个新对象时,会将当前对象管理的资源交给新对象,然后将自己的资源置空
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来的更直接:直接防止拷贝的方式解决智能指针的拷贝问题,简单而又粗暴,防止智能指针对象拷贝,保证资源不会被多次释放,但是防止拷贝也不是解决问题的好办法
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]。
智能指针基础原理 智能指针和普通指针的区别在于智能指针实际上是对普通指针加了一层封装机制,这样的一层封装机制的目的是为了使得智能指针可以方便的管理一个对象的生命期,实现内存的自我回收。...于是我们就想:如果是Test *t不是一个普通的指针变量,而是一个类对象的话,并且在类的析构函数中实现了释放动态内存的步骤,那么只要该指针变量一退出作用域时就会调用析构函数,达到了释放动态内存的目的。...C++11智能指针 四种智能指针 C++ STL为我们提供了四种智能指针: auto_ptr( C++98提供,C++11建议弃用) 主要是用来解决**最基本**的资源自动释放问题 unique_ptr...对于特定对象,同一时刻只能有一个智能指针可拥有, 最终只有拥有对象的智能指针的构造函数会删除该对象,auto_ptr和unique_ptr就是采用这种策略 创建智能更高的指针,跟踪引用特定对象的智能指针个数...选择使用参考 如果程序中要使用多个指向同一个对象的指针,那么应该使用shared_ptr 比如说现在有一个包含指针的STL容器,现在用某个支持复制和赋值操作的STL算法去操作该容器的指针元素,那么就应该用
) { 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,为什么改呢,咱也不知道,学就完事儿了。
领取专属 10元无门槛券
手把手带您无忧上云