智能指针简谈
1.智能指针的优势解决内存泄漏在我们进行new 和delete时都要进行手动开辟与释放一旦忘记就会导致内存泄漏并且还有一种情况就是如果在new 和delete 的过程中如果抛出异常导致跳出就不能执行到delete的代码也会导致内存泄漏。{ //一个函数内部 new 一个资源 function() 如果中途抛出异常就会直接跳出 delete 原来的资源 }智能指针遵循RAII也就是资源申请立即初始化。让资源申请与释放与对象绑定在对象销毁的同时对资源进行释放而不用手动释放保证了安全性。智能指针还会像迭代器一样进行重载operator,operator(),operator[]进行资源的访问比如拷贝赋值拷贝构造等等2.智能指针详解2.1auto_ptr这是C98引入的智能指针但是现在已经被废弃原因是当一个资源被拷贝后会直接将被拷贝对象的资源管理权转移到拷贝对象之下也就会导致被拷贝对象的置空只是一个很危险的操作会导致内存泄漏2.2shared_ptr支持拷贝支持移动引入了引用计数需要拷贝的时候可以用每一个资源申请时可以使用make_shared构建同时可以传参删除器比如有delete[]的对象传入如果不传入删除器就只会执行delete会导致内存泄漏引用计数并不是简单的静态变量而是需要在堆上开辟一块空间专门用来存储每多一个shared_ptr指向资源引用计数就1反之-1只有当引用计数为0才释放资源2.3unique_ptr不支持拷贝只支持移动2.4weak_ptr最主要的作用是解决shared_ptr的循环引用问题3.循环引用这是只有在shared_ptr才会出现的情况比如shared_ptr a 和 shared_ptr b分别指向两块资源这时两块资源的引用计数都为1假设此时两块资源都有next和prev指针然后让a资源 的next指针指向bb资源 的prev 指针指向a ,此时两块资源分别由 a 和 b资源 的prev / b 和 a资源 的next 管理那么也就是说两块资源的引用计数都为2此时如果a和b都释放也就是说只有next和prev指向资源此时两块资源的引用计数都为1但是此时next想要释放就要a资源释放prev资源想要释放就要b资源释放但是a释放需要引用计数减为0也就是prev释放同理prev陷入了循环引用这时候weak_ptr就有了用武之地weak_ptr管理资源时不会让资源的引用计数1这里留一个伏笔weak_ptr能不能访问到引用计数为什么他要访问然后当上述内种极端情况出现上面说的next 与 prev都是shared_ptr 实现的此时就让next与prev使用weak_ptr来进行实现。回收伏笔weak_ptr需要访问到引用计数原因是当一个引用计数为0的资源如果weak_ptr去管理会导致野指针肯定是不可以的那么weak_ptr就要知道他管理的资源引用计数是否大于0 当等于0时资源和weak_ptr都要释放。shared_ptr的线程安全问题我们上面了解了shared_ptr有引用计数那么每多一个shared_ptr指向资源都要将引用计数1但是此时如果有很多个shared_ptr同时出现那么这个引用计数怎么保证线程安全这里有两个解决方法1.加锁保证引用计数每次只能一个shared_ptr来修改2.原子性计数atomicint此时还要明确一个观点shared_ptr使用加锁或者atomic后是线程安全的但是shared_ptr指向的对象不一定是需要外层调用的时候去保证因为shared_ptr也不能保证他指向对象的安全
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2422247.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!