C++ — 智能指针的简单实现以及循环引用问题
http://blog.csdn.net/dawn_sf/article/details/70168930
智能指针
____________________________________________________
- struct AA
- {
- int a = 10;
- int b = 20;
- };
- template<class T>
- class A
- {
- public:
- A(T* ptr)
- :_ptr(ptr)
- {}
- T* operator->()
- {
- return _ptr;
- }
- T& operator*()
- {
- return *_ptr;
- }
- A(A<T>& ap)
- {}
- A<T>& operator=(A<T>& ap)
- {}
- ~A()
- {delete _ptr;}
- protected:
- T* _ptr;
- };
- int main()
- {
- A<int>ap1(new int);
- *ap1 = 10;
- A<AA>ap2(new AA);
- cout << *ap1 << endl;
- cout << (ap2->a)<<" "<<(ap2->b) << endl;
- return 0;
- }
智能指针的三大版本的实现==>
管理权转移==>
- template<class T>
- class AutoPtr
- {
- public:
- AutoPtr(T* ptr)
- :_ptr(ptr)
- {}
- T* operator->()
- {
- return _ptr;
- }
- T& operator*()
- {
- return *_ptr;
- }
- AutoPtr(AutoPtr<T>& ap)
- {
- this->_ptr = ap._ptr;
- ap._ptr = NULL;
- }
- AutoPtr<T>& operator=(AutoPtr<T>& ap)
- {
- if (this != &ap)
- {
- delete this->_ptr;
- this->_ptr = ap._ptr;
- ap._ptr = NULL;
- }
- return *this;
- }
- ~AutoPtr()
- {
- cout << "智能指针爸爸已经释放过空间了" << endl;
- delete _ptr;
- }
- protected:
- T* _ptr;
- };
- int main()
- {
- AutoPtr<int>ap1(new int);
- *ap1 = 10;
- AutoPtr<int>ap2(ap1);
- AutoPtr<int>ap3(ap2);
- *ap3 = 20;
- ap2 = ap3;
- cout << *ap2 <<endl;
- return 0;
- }
现在我们先看看它使用普通操作时的结果如何:
{
AutoPtr<int>ap1(new int);
*ap1 = 10;
AutoPtr<int>ap2(ap1);
cout << *ap1 << endl;
return 0;
}
简单粗暴法(防拷贝)==>
- template<class T>
- class ScopedPtr
- {
- public:
- ScopedPtr()
- {}
- AutoPtr(T* ptr)
- :_ptr(ptr)
- {}
- T* operator->()
- {
- return _ptr;
- }
- T& operator*()
- {
- return *_ptr;
- }
- ~AutoPtr()
- {
- cout << "智能指针爸爸已经释放过空间了" << endl;
- delete _ptr;
- }
- protected:
- ScopedPtr(ScopedPtr<T>& s);
- ScopedPtr<T> operator=(ScopedPtr<T>& s);
- protected:
- T* _ptr;
- };
它的意思就是,我根本不会提供拷贝构造 和 "="的功能,他强任他强,我就是这样。他确实解决上一个智能指针的问题,他直接让用户不能使用这个
引用计数版本==>
- template<class T>
- class shared
- {
- public:
- shared(T* ptr)
- :_ptr(ptr)
- , _num(new int(1))
- {
- }
- shared(const shared<T>& ap)
- :_ptr(ap._ptr)
- , _num(ap._num)
- {
- ++(*_num);
- }
- shared<T>& operator=(const shared<T>& ap)
- {
- if (_ptr != ap._ptr)
- {
- Release();
- _ptr = ap._ptr;
- _num = ap._num;
- ++(*_num);
- }
- return *this;
- }
- T* operator->()
- {
- return _ptr;
- }
- T& operator*()
- {
- return *_ptr;
- }
- void Release()
- {
- if (0 == (--*_num))
- {
- cout << "智能指针爸爸帮你释放空间了" << endl;
- delete _ptr;
- delete _num;
- _ptr = NULL;
- _num = NULL;
- }
- }
- ~shared()
- {
- Release();
- }
- protected:
- T* _ptr;
- int* _num;
- };
- int main()
- {
- shared<int>ap1(new int);
- *ap1 = 2;
- shared<int>ap2(ap1);
- cout << *ap2 << endl;
- shared<int>ap3(new int);
- ap3 = ap1;
- }
上面就是我实现的简易的shared智能指针,现在我们调用这个智能指针,我们来看看结果:
- struct ListNode
- {
- int _data;
- shared_ptr<ListNode> _prev;
- shared_ptr<ListNode> _next;
- ListNode(int x)
- :_data(x)
- , _prev(NULL)
- ,_next(NULL)
- {}
- ~ListNode()
- {
- cout << "~ListNode" << endl;
- }
- };
- int main()
- {
- shared_ptr<ListNode> cur(new ListNode(1));
- shared_ptr<ListNode> next(new ListNode(2));
- cur->_next = next;
- next->_prev = cur;
- cout << "cur" << " " << cur.use_count() << endl;
- cout << "next" << " " << next.use_count() << endl;
- return 0;
- }
现在我们验证shared智能指针的缺陷,就不用我实现的那个了,那个好多功能我都没实现,我们用专家写的shared_ptr智能指针,构造两个双向链表里
week_ptr==>
现在总结一下:
1、在可以使用 boost 库的场合下,拒绝使用 std::auto_ptr,因为其不仅不符合 C++ 编程思想。
2、在确定对象无需共享的情况下,使用 boost::scoped_ptr。
3、在对象需要共享的情况下,使用 boost::shared_ptr。
4、在需要访问 boost::shared_ptr 对象,而又不想改变其引用计数的情况下(循环引用)使用boost::weak_ptr。
5、最后一点,在你的代码中,尽量不要出现 delete 关键字,因为我们有智能指针。
C++ — 智能指针的简单实现以及循环引用问题相关推荐
- C++智能指针及其简单实现
原文:http://www.cnblogs.com/xiehongfeng100/p/4645555.html C++智能指针及其简单实现 本文将简要介绍智能指针shared_ptr和unique_p ...
- 【C++ 语言】智能指针 引入 ( 内存泄漏 | 智能指针简介 | 简单示例 )
文章目录 I . 智能指针 引入 II . 智能指针 简介 III . 智能指针 简单示例 I . 智能指针 引入 1 . 示例前提 : 定义一个 Student 类 , 之后将该类对象作为智能指针指 ...
- C++ 智能指针的简单原理
C++ 智能指针的简单原理 为什么会有智能指针的原因 delete引起的内存泄漏 智能指针的使用及其原理 RAII auto_ptr std::unique_ptr std::shared_ptr(线 ...
- C++智能指针(一)智能指针的简单介绍
https://blog.csdn.net/nou_camp/article/details/70176949 C++智能指针 在正式了解智能指针前先看一下下面的一段代码 #include<i ...
- C++ 几种智能指针的简单实现
#pragma once // 智能指针 // 定义个类来封装资源的分配和释放,在构造 函数完成资源的分配和初始化,在析构函数完成资源的 // 清理,可以 保证资源的正确初始化和释放. // 这里简单 ...
- C++智能指针:更简单、更高效的内存管理方法
C++智能指针:从新手到高手的心理密码C++ Smart Pointers: Psychological Passcodes from Beginner to Expert 智能指针简介 (Intro ...
- Qt智能指针--QWeakPointer
文章目录 概述 QWeakPointer 示例 概述 前面我们说到的QSharedPointer是一个强引用类型的智能指针,而QWeakPointer是一个弱引用类型的智能指针,和C++中的weak_ ...
- C++ STL 四种智能指针
文章目录 0.前言 1.unique_ptr 2.auto_ptr 3.shared_ptr 3.1 shared_ptr 简介 3.2 通过辅助类模拟实现 shared_ptr 4.weak_ptr ...
- Qt 之 智能指针汇总
来源 还有其他一些,做了一些汇总和测试,就不全列了. 文章目录: 一.垂悬指针的问题 二.Qt中的智能指针 1.QPointer 2.QSharedPointer & ...
最新文章
- Java 反射机制学习资料
- isdigit函数python检测数字个数_Python isdecimal isdigit isnumeric区别
- 【Paper】2004_Information Flow and Cooperative Control of Vehicle Formations
- Win7 64位下PowerDesigner连接64位Oracle11g数据库
- 设计模式之SOLID原则再回首
- iis express8 自动关闭
- 对抗学习新进展:MIT和微软联合出品“元对抗扰动”
- nginx绑定IP的坑
- 如何在几秒钟内退出所有 Mac 应用程序?
- 【交通标志识别】基于matlab GUI BP神经网络交通标志识别(带面板)【含Matlab源码 1647期】
- 如何去除html的flash,去除网站Flash动画效果,提升seo优化友好度
- 利用cmake来编译sim800c,sim868 app
- WIFI-WPA破解
- “Failed to load response data“ django@xframe_options_exempt 网站不许 Firefox 显示被嵌入的网页
- 在梦想的道路上,一路前行
- 东北师范大学计算机学院的导师李俊,东北师范大学计算机科学与信息技术学院研究生导师简介-胡丽红...
- 【虹科云展厅专题】虹科赋能汽车智能化云展厅——汽车总线专题
- Fortran进行t检验后使用GrADS画打点图
- jenkins学习4-进docker容器安装python3环境
- ElasticSearch——手写一个ElasticSearch分词器(附源码)
热门文章
- 单片机串行通信全解析
- java学习笔记总略
- [转载]SQL Plus 一些使用技巧
- mac你没有权限打开应用程序_如何管理Mac的隐私权限控制
- oracle外表日期,三步教会您掌握oracle外表(external table)
- linux文件分别打包命令,Linux文件打包命令
- 华为怎么改输入法皮肤_微信和QQ个性键盘皮肤
- java i o总结_Java I/O 总结
- java数_java大数
- 习题6-5 使用函数验证哥德巴赫猜想 (20 分)