C++中各种智能指针的实现及弊端(二)
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++中各种智能指针的实现及弊端(二)相关推荐
- C++中各种智能指针的实现及弊端(四)
C++中各种智能指针的实现及弊端(四) 文章目录 C++中各种智能指针的实现及弊端(四) 一.std::shared_ptr 二.std::shared_ptr的线程安全问题: 一.std::shar ...
- C++中各种智能指针的实现及弊端(五)
C++中各种智能指针的实现及弊端(五) 文章目录 C++中各种智能指针的实现及弊端(五) 一.std::shared_ptr的循环引用 **二.循环引用分析:** 三.解决方法: 四.weak_ptr ...
- C++中各种智能指针的实现及弊端(三)
C++中各种智能指针的实现及弊端(三) 文章目录 C++中各种智能指针的实现及弊端(三) 一: std::unique_ptr 二.**std::unique_ptr的缺陷** 一: std::uni ...
- C++中各种智能指针的实现及弊端(一)
C++中各种智能指针的实现及弊端(一) 文章目录 C++中各种智能指针的实现及弊端(一) 一.为什么需要智能指针? 二.智能指针的使用及原理: 一.为什么需要智能指针? 首先看一段代码: #inclu ...
- c语言智能指针是什么,C ++中的智能指针
原标题:C ++中的智能指针 考虑以下带有普通指针的简单C ++代码. MyClass *ptr = new MyClass(); ptr->doSomething(); // We must ...
- 标准库中的智能指针shared_ptr
智能指针的出现是为了能够更加方便的解决动态内存的管理问题.注:曾经记得有本书上说可以通过vector来实现动态分配的内存的自动管理,但是经过试验,在gcc4.8.5下是不行的.这个是容易理解的,vec ...
- c++ 智能指针_详解 C++ 11 中的智能指针
C/C++ 语言最为人所诟病的特性之一就是存在内存泄露问题,因此后来的大多数语言都提供了内置内存分配与释放功能,有的甚至干脆对语言的使用者屏蔽了内存指针这一概念.这里不置贬褒,手动分配内存与手动释放内 ...
- c+智能指针源码分析_C ++中的智能指针
c+智能指针源码分析 In this article, we'll take a look at how we can use Smart Pointers in C++. 在本文中,我们将研究如何在 ...
- C++ 中的智能指针以及如何使用它们
在本文中,我们将讨论 C++ 中的智能指针.什么是智能指针,为什么以及如何正确使用它们? 指针用于访问程序外部的资源--比如堆内存.因此,为了访问堆内存(如果在堆内存中创建了任何东西),需要使用指针. ...
最新文章
- 手机qq2008触屏版_比微信老却是00后最爱 手机QQ 16年进化史
- 第四篇[机器学习] 机器学习,线性回归的优化
- rehat linux设置ip,RedhatHat配置IPv6地址
- python封装成exe后运行失败_Python的带pandas包的程序封装成exe 2018-01-11
- 商务部回应中兴被罚:坚决反对美国用国内法制裁中企
- 蓝绿部署、滚动发布、灰度发布等方案对比总结
- ora-01189故障解决办法
- VC 和 VS 区别
- Spring的bean是怎么保证线程安全的
- 2019年7月4日西藏17日之旅
- linux下安装虚拟天文馆,如何在Ubuntu 18.04/17.10/16.04中安装Stellarium 0.17.0 虚拟天文馆...
- 超全汇总 | 基于Camera的3D目标检测算法综述!(单目/双目/伪激光雷达)
- 【小程序】报getUserProfile:fail can only be invoked by user TAP gesture.
- WTP协议简要翻译一(dlmu2001)
- android room详解
- Ubuntu18.04安装NVIDIA 显卡驱动(GTX 1060)
- scanner 获取控制台信息_关于java.util.scanner:如何使用Java中的Scanner类从控制台读取输入?...
- UE4 SoundCue声音节点总结
- 电音与计算机相关吗,什么是电音声卡 电音声卡功能和区别介绍【图文】
- 计算机忘记用户密码,电脑开机密码忘记了怎么办?