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内存了。
为什么需要智能指针? 如果是下面这段程序, 会不会有什么问题?...上述的SmartPtr还不能将其称为智能指针,因为它还不具有指针的行为。...搞除了更好用的scoped_ptr/shared_ptr/weak_ptr // C++11将boost库中智能指针精华部分吸收了过来 // C++11->unique_ptr/shared_ptr/weak_ptr...C++11和boost中智能指针的关系 C++ 98 中产生了第一个智能指针auto_ptr. C++ boost给出了更实用的scoped_ptr和shared_ptr和weak_ptr....并且这些智能指针的实现原理是参考boost中的实现的。
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++ 新标准提倡的理念之一是不应该再手动调用 delete 或者 free 函数去释放内存了,而应该把它们交给新标准提供的各种智能指针对象。...C++ 新标准中的各种智能指针是如此的实用与强大,在现代 C++ 项目开发中,读者应该尽量去使用它们。...); ~Test(); private: std::unique_ptr m_spA; }; C++ 新标准中的智能指针我想介绍的就这么多了,Modern C/C++ 已经变为 C.../C++ 开发的趋势,希望读者能善用和熟练使用本节介绍的后三种智能指针对象。
1.智能指针的使用场景分析 下⾯程序中我们可以看到,new了以后,我们也delete了,但是因为抛异常导,后⾯的delete没有得到执⾏,所以就内存泄漏了,所以我们需要new以后捕获异常,捕获到异常后...) { cout << " 未知异常 " << endl; } return 0 ; } 3.C++标准库智能指针的使用 C++标准库中的智能指针都在...智能指针⽀持在构造时给⼀个删除器,所谓删除器本质就是⼀个可调⽤ 对象,这个可调⽤对象中实现你想要的释放资源的⽅式,当构造智能指针时,给了定制的删除器, 在智能指针析构时就会调⽤删除器去释放资源...C++ 98 中产⽣了第⼀个智能指针auto_ptr。...并且这些智能指针的实现原理是参考boost中的实现的。 结束语 本篇博客结束,至此,C++所有的基础知识总结完毕,Linux见!
目录 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了以后,我们也delete了,但是因为抛异常导,后面的delete没有得到执行,所以就内存泄漏了,所以我们需要new以后捕获异常,捕获到异常后delete...) { cout << "未知异常" << endl; } return 0; } 三、C++标准库智能指针的使用 C++标准库中的智能指针都在这个头文件下面,我们包含就可以是使用了,智能指针有好几种...智能指针支持在构造时给一个删除器,所谓删除器本质就是一个可调用对象,这个可调用对象中实现你想要的释放资源的方式,当构造智能指针时,给了定制的删除器,在智能指针析构时就会调用删除器去释放资源。...在Boost库的开发中,Boost社区也在这个方向上取得了丰硕的成果,C++11及之后的新语法 和库有很多都是从Boost中来的。 C++ 98 中产生了第一个智能指针auto_ptr。...并且这些智能指针的实现原理是参考boost中的实现的。
,这个类可以帮我们自动析构智能指针,有效的避免了指针释放问题。...> 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的做法是 将每个对象存一个指向引用计数的指针。
一,什么是智能指针 在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中管理的资源是否存在
智能指针 一、为什么需要智能指针?...内存泄漏的分类 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++ 语言没有自动内存回收机制,程序员每次 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]。
会调用构造函数,将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(利用对象生命周期来控制程序资源
int>* _pcount; function _del = [](T* ptr) {delete ptr; }; }; } std::shared_ptr的线程安全问题 智能指针对象中引用计数是多个智能指针对象共享的...,两个线程中智能指针的引用计数同时 ++或--,这个操作不是原子的,引用计数原来是1,++了两次,可能还是2.这样引用计数就错 乱了。...所以只能指针中引用计数++、--是需要加锁 的,也就是说引用计数的操作是线程安全的。 智能指针管理的对象存放在堆上,两个线程中同时去访问,会导致线程安全问题。...C++11和boost中智能指针的关系 C++ 98 中产生了第一个智能指针auto_ptr. C++ boost给出了更实用的scoped_ptr和shared_ptr和weak_ptr....并且这些智能指针的实现原理是参考boost中的实现的。 内存泄漏 什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。
关于内存泄漏,我也曾在C++内存管理一文中写过。 为了更好的管理我们申请的空间,C++引入了智能指针。 参考文章: 1.【C++】异常_ 2. ...在封装了几层的函数中抛异常,我们也能够来通过智能指针来管理好空间。 2.智能指针的完善 上述的 SmartPtr 还不能将其称为智能指针,因为它还不具有指针的行为。...但是我们发现,智能指针没有提供拷贝的功能,那么接下来我们看看库中实现的智能指针是如何做的?...---- 三、标准库中的智能指针 1.std::auto_ptr 参考文献:std::auto_ptr auto_ptr 是C++库中的第一个智能指针,其在面对拷贝构造的解决办法是:转移所有权(当用当前的智能指针对象拷贝出一个新对象时...所以在我们对智能指针中的资源操作的时候,我们也需要手动加锁。 C)shared_ptr中的循环引用问题 虽然shared_ptr相较于以往的智能指针,表现的十分好,但是仍旧是有缺陷的。
C++智能指针 为什么要使用智能指针? C++ Primer>> p400 虽然使用动态内存有时是必要的,但众所周知,正确地管理动态内存是非常棘手的。...release返回的指针通常被用来初始化另一个智能指针或给另一个智能指针赋值。在本例中,管理内存的责任简单地从一个指针转给了另一个。...Boy()); sp_girl->set_boy_friend(sp_boy); sp_boy->set_girl_friend(sp_girl); //对象引用计数都为2 //定义的指针和类中私有属性中的指针...类中弱指针,用shared指针构造weak指针,用的时候,将weak指针转成shared指针来调用成员函数。...禁止用任何类型智能指针get 函数返回的指针去初始化另外一个智能指针!
参考资料:《C++ Primer中文版 第五版》 我们知道除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆。...在C++中,动态内存的管理是用一对运算符完成的:new和delete,new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针,delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存...标准库还定义了一种名为weak_ptr的伴随类,它是一种弱引用,指向shared_ptr所管理的对象,这三种智能指针都定义在memory头文件中。...智能指针的使用方式和普通指针类似,解引用一个智能指针返回它指向的对象,在一个条件判断中使用智能指针就是检测它是不是空。...如果这种形式的new不能分配所需内存,它会返回一个空指针。bad_alloc和nothrow都在头文件new中。
领取专属 10元无门槛券
手把手带您无忧上云