C++中各种智能指针的实现及弊端(二)

文章目录

  • C++中各种智能指针的实现及弊端(二)
  • 一:实现auto_ptr
  • 二、auto_ptr的问题及解决办法

一:实现auto_ptr

C ++98版本的库中提供了auto_ptr的智能指针:
auto_ptr文档

// C++库中的智能指针都定义在memory这个头文件中
#include <memory>
class Date
{public:Date() { cout << "Date()" << endl;}~Date(){ cout << "~Date()" << endl;}int _year;int _month;int _day;
};int main()
{auto_ptr<Date> ap(new Date);auto_ptr<Date> copy(ap);// auto_ptr的问题:当对象拷贝或者赋值后,前面的对象就悬空了// C++98中设计的auto_ptr问题是非常明显的,所以实际中很多公司明确规定了不能使用  auto_ptrap->_year = 2018;return 0;
}
  • auto_ptr的实现原理:管理权转移的思想,下面简化模拟实现了一份AutoPtr来了解它的原理
// 模拟实现一份简答的AutoPtr,了解原理
template<class T>
class AutoPtr
{public:AutoPtr(T* ptr = NULL): _ptr(ptr){}~AutoPtr(){if(_ptr)delete _ptr;}// 一旦发生拷贝,就将ap中资源转移到当前对象中,然后另ap与其所管理资源断开联系,// 这样就解决了一块空间被多个对象使用而造成程序奔溃问题AutoPtr(AutoPtr<T>& ap): _ptr(ap._ptr){ap._ptr = NULL;}AutoPtr<T>& operator=(AutoPtr<T>& ap){// 检测是否为自己给自己赋值if(this != &ap){// 释放当前对象中资源if(_ptr)delete _ptr;// 转移ap中资源到当前对象中_ptr = ap._ptr;ap._ptr = NULL;}return *this;}T& operator*() {return *_ptr;}T* operator->() { return _ptr;}
private:T* _ptr;
};int main()
{AutoPtr<Date> ap(new Date);// 现在再从实现原理层来分析会发现,这里拷贝后把ap对象的指针赋空了,导致ap对象悬空// 通过ap对象访问资源时就会出现问题。AutoPtr<Date> copy(ap);ap->_year = 2018;return 0;
}

二、auto_ptr的问题及解决办法

原理:

  • 缺陷:一旦发生拷贝后,就只能有一个对象可以操纵他们所管理的资源,因为原对象已经断开和资源的链接
  • 解决办法:可以引入一个变量控制资源的释放权,即不断开就对象和资源的联系,发生拷贝时,让就对象无法获得资源释放权即可,具体代码自己实现,这个比较简单,加一个bool类型的成员变量即可

但是采用上面的解决方法仍然有缺陷:

  • 可能会造成野指针问

C++中各种智能指针的实现及弊端(二)相关推荐

  1. C++中各种智能指针的实现及弊端(四)

    C++中各种智能指针的实现及弊端(四) 文章目录 C++中各种智能指针的实现及弊端(四) 一.std::shared_ptr 二.std::shared_ptr的线程安全问题: 一.std::shar ...

  2. C++中各种智能指针的实现及弊端(五)

    C++中各种智能指针的实现及弊端(五) 文章目录 C++中各种智能指针的实现及弊端(五) 一.std::shared_ptr的循环引用 **二.循环引用分析:** 三.解决方法: 四.weak_ptr ...

  3. C++中各种智能指针的实现及弊端(三)

    C++中各种智能指针的实现及弊端(三) 文章目录 C++中各种智能指针的实现及弊端(三) 一: std::unique_ptr 二.**std::unique_ptr的缺陷** 一: std::uni ...

  4. C++中各种智能指针的实现及弊端(一)

    C++中各种智能指针的实现及弊端(一) 文章目录 C++中各种智能指针的实现及弊端(一) 一.为什么需要智能指针? 二.智能指针的使用及原理: 一.为什么需要智能指针? 首先看一段代码: #inclu ...

  5. c语言智能指针是什么,C ++中的智能指针

    原标题:C ++中的智能指针 考虑以下带有普通指针的简单C ++代码. MyClass *ptr = new MyClass(); ptr->doSomething(); // We must ...

  6. 标准库中的智能指针shared_ptr

    智能指针的出现是为了能够更加方便的解决动态内存的管理问题.注:曾经记得有本书上说可以通过vector来实现动态分配的内存的自动管理,但是经过试验,在gcc4.8.5下是不行的.这个是容易理解的,vec ...

  7. c++ 智能指针_详解 C++ 11 中的智能指针

    C/C++ 语言最为人所诟病的特性之一就是存在内存泄露问题,因此后来的大多数语言都提供了内置内存分配与释放功能,有的甚至干脆对语言的使用者屏蔽了内存指针这一概念.这里不置贬褒,手动分配内存与手动释放内 ...

  8. c+智能指针源码分析_C ++中的智能指针

    c+智能指针源码分析 In this article, we'll take a look at how we can use Smart Pointers in C++. 在本文中,我们将研究如何在 ...

  9. C++ 中的智能指针以及如何使用它们

    在本文中,我们将讨论 C++ 中的智能指针.什么是智能指针,为什么以及如何正确使用它们? 指针用于访问程序外部的资源--比如堆内存.因此,为了访问堆内存(如果在堆内存中创建了任何东西),需要使用指针. ...

最新文章

  1. 手机qq2008触屏版_比微信老却是00后最爱 手机QQ 16年进化史
  2. 第四篇[机器学习] 机器学习,线性回归的优化
  3. rehat linux设置ip,RedhatHat配置IPv6地址
  4. python封装成exe后运行失败_Python的带pandas包的程序封装成exe 2018-01-11
  5. 商务部回应中兴被罚:坚决反对美国用国内法制裁中企
  6. 蓝绿部署、滚动发布、灰度发布等方案对比总结
  7. ora-01189故障解决办法
  8. VC 和 VS 区别
  9. Spring的bean是怎么保证线程安全的
  10. 2019年7月4日西藏17日之旅
  11. linux下安装虚拟天文馆,如何在Ubuntu 18.04/17.10/16.04中安装Stellarium 0.17.0 虚拟天文馆...
  12. 超全汇总 | 基于Camera的3D目标检测算法综述!(单目/双目/伪激光雷达)
  13. 【小程序】报getUserProfile:fail can only be invoked by user TAP gesture.
  14. WTP协议简要翻译一(dlmu2001)
  15. android room详解
  16. Ubuntu18.04安装NVIDIA 显卡驱动(GTX 1060)
  17. scanner 获取控制台信息_关于java.util.scanner:如何使用Java中的Scanner类从控制台读取输入?...
  18. UE4 SoundCue声音节点总结
  19. 电音与计算机相关吗,什么是电音声卡 电音声卡功能和区别介绍【图文】
  20. 计算机忘记用户密码,电脑开机密码忘记了怎么办?

热门文章

  1. 08 线性回归 + 基础优化算法【动手学深度学习v2】
  2. pytorch教程龙曲良41-45
  3. ubuntu双系统把win7设置为默认启动选项
  4. 全国首家工资总额负面清单管理试点企业获批
  5. 20155301实验三 免杀原理与实践
  6. 在spring中使用自定义注解注册监听器
  7. 浅析php中的stdClass
  8. 关于TobjectList的一点疑问
  9. CodeForces - 160D Edges in MST(思维+tarjan/树链剖分+线段树)
  10. 牛客 - 求函数(线段树+区间合并/线段树+矩阵维护)