SlideShare a Scribd company logo
1 of 26
智能指针的使用和简单实现
Agenda ,[object Object],[object Object],[object Object]
什么是智能指针 ,[object Object],[object Object],[object Object]
提供  ->  和  * template <typename T> class SmartPtr { public: explicit SmartPtr(T* pointee) {this->pointee_ = pointee;}; ~SmartPtr(); SmartPtr& operator =(const SmartPtr& other); T& operator *() const {return *pointee_;}; T* operator ->() const {return pointee_;}; private: T* pointee_; }; class Foo { public: void get(); }; SmartPtr<Foo> foo(new Foo); foo->get(); (*foo).get();
简单的例子 :Bad Code ,[object Object],[object Object],[object Object],[object Object]
现实代码 ,[object Object],[object Object],[object Object],[object Object]
如果是智能指针 ,[object Object],[object Object],[object Object],[object Object],[object Object]
智能指针提供的一般方法 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
shared_ptr 还定义了其他一些 ,[object Object],[object Object]
目前常见的智能指针 ,[object Object],[object Object],[object Object]
它们之间的区别 std::auto_ptr 销毁式、不能应用于 STL 容器和数组 scoped_ptr const std::auto_ptr scoped_array const std::auto_ptr for array shared_ptr 引用计数实现多个指针共享对象的所有权 shared_array weak_ptr intrusive_ptr ?
为什么需要 weak_ptr (强引用) class Children { public: boost::shared_ptr<Parent> his_parent; }; boost::shared_ptr<Parent> father(new Parent()); boost::shared_ptr<Children> son(new Children()); // memory leak will be happended in here father->his_children = son; son->his_parent = father;
使用 weak_ptr ,[object Object],[object Object],[object Object],[object Object]
如何设计智能指针 ,[object Object],[object Object],[object Object],[object Object]
Storage Policy ,[object Object],[object Object],[object Object],[object Object]
深层拷贝
引用计数
引用计数
引用计数
引用链接
Conversion policy ,[object Object],[object Object],[object Object],[object Object],[object Object]
由设计者决定 ,[object Object],[object Object],[object Object],[object Object],[object Object]
Checking policy ,[object Object],[object Object],[object Object]
一切都组合起来 #include <cstdlib> #include <iostream> #include <string> #include <loki/SmartPtr.h> using namespace std; typedef Loki::SmartPtr<string, Loki::RefCounted, Loki::DisallowConversion, Loki::AssertCheck, Loki::DefaultSPStorage> SmartPointer; int main(int argc, char **argv) { SmartPointer myName(new string(&quot;Wu Liang&quot;)); SmartPointer copiedName = myName; cout << *myName << endl; cout << *copiedName << endl; }
参考资料 ,[object Object],[object Object],[object Object]
Q/A

More Related Content

Viewers also liked

Trie树分享
Trie树分享Trie树分享
Trie树分享Wu Liang
 
向量空间模型与动态规划分享
向量空间模型与动态规划分享 向量空间模型与动态规划分享
向量空间模型与动态规划分享 Wu Liang
 
Bst svn专项培训
Bst svn专项培训Bst svn专项培训
Bst svn专项培训Wu Liang
 
检查实现类
检查实现类检查实现类
检查实现类Wu Liang
 
Dynamo cassandra
Dynamo cassandraDynamo cassandra
Dynamo cassandraWu Liang
 
An Efficient Language Model Using Double-Array Structures
An Efficient Language Model Using Double-Array StructuresAn Efficient Language Model Using Double-Array Structures
An Efficient Language Model Using Double-Array StructuresJun-ya Norimatsu
 

Viewers also liked (7)

Trie树分享
Trie树分享Trie树分享
Trie树分享
 
向量空间模型与动态规划分享
向量空间模型与动态规划分享 向量空间模型与动态规划分享
向量空间模型与动态规划分享
 
Hmaster
HmasterHmaster
Hmaster
 
Bst svn专项培训
Bst svn专项培训Bst svn专项培训
Bst svn专项培训
 
检查实现类
检查实现类检查实现类
检查实现类
 
Dynamo cassandra
Dynamo cassandraDynamo cassandra
Dynamo cassandra
 
An Efficient Language Model Using Double-Array Structures
An Efficient Language Model Using Double-Array StructuresAn Efficient Language Model Using Double-Array Structures
An Efficient Language Model Using Double-Array Structures
 

Similar to Smart pointer

1 C入門教學
1  C入門教學1  C入門教學
1 C入門教學Sita Liu
 
GAE/J 簡介
GAE/J 簡介GAE/J 簡介
GAE/J 簡介Cloud Tu
 
Spry框架的简单使用小结
Spry框架的简单使用小结Spry框架的简单使用小结
Spry框架的简单使用小结sunnylqm
 
C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程deer hope
 
Struts1+ hibernate3
Struts1+ hibernate3Struts1+ hibernate3
Struts1+ hibernate3edanwade
 
数据处理算法设计要点
数据处理算法设计要点数据处理算法设计要点
数据处理算法设计要点thinkinlamp
 
Xml Introduction Practice
Xml Introduction PracticeXml Introduction Practice
Xml Introduction Practicequeenskimo
 
ajax_onlinemad
ajax_onlinemadajax_onlinemad
ajax_onlinemadKitor23
 
组件交互模式的非主流研究
组件交互模式的非主流研究组件交互模式的非主流研究
组件交互模式的非主流研究youalab
 
Anroid development part.1
Anroid development part.1Anroid development part.1
Anroid development part.1RANK LIU
 
给聚划算后端开发的前端培训
给聚划算后端开发的前端培训给聚划算后端开发的前端培训
给聚划算后端开发的前端培训j5726
 
Asp.net mvc 培训
Asp.net mvc 培训Asp.net mvc 培训
Asp.net mvc 培训lotusprince
 
搜狐Pv insight(py)技术交流
搜狐Pv insight(py)技术交流搜狐Pv insight(py)技术交流
搜狐Pv insight(py)技术交流bj
 
搜狐Pv insight(py)技术交流
搜狐Pv insight(py)技术交流搜狐Pv insight(py)技术交流
搜狐Pv insight(py)技术交流jondynet
 
从问题开始,谈前端架构
从问题开始,谈前端架构从问题开始,谈前端架构
从问题开始,谈前端架构裕波 周
 

Similar to Smart pointer (20)

1 C入門教學
1  C入門教學1  C入門教學
1 C入門教學
 
GAE/J 簡介
GAE/J 簡介GAE/J 簡介
GAE/J 簡介
 
Spry框架的简单使用小结
Spry框架的简单使用小结Spry框架的简单使用小结
Spry框架的简单使用小结
 
C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程
 
Struts1+ hibernate3
Struts1+ hibernate3Struts1+ hibernate3
Struts1+ hibernate3
 
数据处理算法设计要点
数据处理算法设计要点数据处理算法设计要点
数据处理算法设计要点
 
C語言結構與串列
C語言結構與串列 C語言結構與串列
C語言結構與串列
 
第4章函数
第4章函数第4章函数
第4章函数
 
Xml Introduction Practice
Xml Introduction PracticeXml Introduction Practice
Xml Introduction Practice
 
ajax_onlinemad
ajax_onlinemadajax_onlinemad
ajax_onlinemad
 
组件交互模式的非主流研究
组件交互模式的非主流研究组件交互模式的非主流研究
组件交互模式的非主流研究
 
Anroid development part.1
Anroid development part.1Anroid development part.1
Anroid development part.1
 
给聚划算后端开发的前端培训
给聚划算后端开发的前端培训给聚划算后端开发的前端培训
给聚划算后端开发的前端培训
 
Asp.net mvc 培训
Asp.net mvc 培训Asp.net mvc 培训
Asp.net mvc 培训
 
第5章数组
第5章数组第5章数组
第5章数组
 
Js dom
Js domJs dom
Js dom
 
搜狐Pv insight(py)技术交流
搜狐Pv insight(py)技术交流搜狐Pv insight(py)技术交流
搜狐Pv insight(py)技术交流
 
搜狐Pv insight(py)技术交流
搜狐Pv insight(py)技术交流搜狐Pv insight(py)技术交流
搜狐Pv insight(py)技术交流
 
SCJP ch08
SCJP ch08SCJP ch08
SCJP ch08
 
从问题开始,谈前端架构
从问题开始,谈前端架构从问题开始,谈前端架构
从问题开始,谈前端架构
 

Recently uploaded

GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...
GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...
GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...黑客 接单【TG/微信qoqoqdqd】
 
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...黑客 接单【TG/微信qoqoqdqd】
 
【創業簡報練習】當一個人吃飯會想起誰: (A)I-DOLL 陪吃娃娃|科技創業與營運實務
【創業簡報練習】當一個人吃飯會想起誰:(A)I-DOLL 陪吃娃娃|科技創業與營運實務【創業簡報練習】當一個人吃飯會想起誰:(A)I-DOLL 陪吃娃娃|科技創業與營運實務
【創業簡報練習】當一個人吃飯會想起誰: (A)I-DOLL 陪吃娃娃|科技創業與營運實務sardinesaying
 
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制gravestomas0
 
Grade 6 Lesson 7 Environment Protection.pptx
Grade 6 Lesson 7 Environment Protection.pptxGrade 6 Lesson 7 Environment Protection.pptx
Grade 6 Lesson 7 Environment Protection.pptxPriscilleXu
 
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdfshanshanhui1
 
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptxJAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptxCHANSUITNEEMoe
 
30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...
30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...
30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...ggbob1
 
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制bairnshajjes
 
【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...
【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...
【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...ggbob1
 
哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制
哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制
哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制kathrynalvarez364
 

Recently uploaded (11)

GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...
GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...
GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...
 
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
 
【創業簡報練習】當一個人吃飯會想起誰: (A)I-DOLL 陪吃娃娃|科技創業與營運實務
【創業簡報練習】當一個人吃飯會想起誰:(A)I-DOLL 陪吃娃娃|科技創業與營運實務【創業簡報練習】當一個人吃飯會想起誰:(A)I-DOLL 陪吃娃娃|科技創業與營運實務
【創業簡報練習】當一個人吃飯會想起誰: (A)I-DOLL 陪吃娃娃|科技創業與營運實務
 
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
 
Grade 6 Lesson 7 Environment Protection.pptx
Grade 6 Lesson 7 Environment Protection.pptxGrade 6 Lesson 7 Environment Protection.pptx
Grade 6 Lesson 7 Environment Protection.pptx
 
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
 
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptxJAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
 
30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...
30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...
30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...
 
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
 
【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...
【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...
【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...
 
哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制
哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制
哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制
 

Smart pointer

  • 2.
  • 3.
  • 4. 提供 -> 和 * template <typename T> class SmartPtr { public: explicit SmartPtr(T* pointee) {this->pointee_ = pointee;}; ~SmartPtr(); SmartPtr& operator =(const SmartPtr& other); T& operator *() const {return *pointee_;}; T* operator ->() const {return pointee_;}; private: T* pointee_; }; class Foo { public: void get(); }; SmartPtr<Foo> foo(new Foo); foo->get(); (*foo).get();
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11. 它们之间的区别 std::auto_ptr 销毁式、不能应用于 STL 容器和数组 scoped_ptr const std::auto_ptr scoped_array const std::auto_ptr for array shared_ptr 引用计数实现多个指针共享对象的所有权 shared_array weak_ptr intrusive_ptr ?
  • 12. 为什么需要 weak_ptr (强引用) class Children { public: boost::shared_ptr<Parent> his_parent; }; boost::shared_ptr<Parent> father(new Parent()); boost::shared_ptr<Children> son(new Children()); // memory leak will be happended in here father->his_children = son; son->his_parent = father;
  • 13.
  • 14.
  • 15.
  • 21.
  • 22.
  • 23.
  • 24. 一切都组合起来 #include <cstdlib> #include <iostream> #include <string> #include <loki/SmartPtr.h> using namespace std; typedef Loki::SmartPtr<string, Loki::RefCounted, Loki::DisallowConversion, Loki::AssertCheck, Loki::DefaultSPStorage> SmartPointer; int main(int argc, char **argv) { SmartPointer myName(new string(&quot;Wu Liang&quot;)); SmartPointer copiedName = myName; cout << *myName << endl; cout << *copiedName << endl; }
  • 25.
  • 26. Q/A

Editor's Notes

  1. 当然,拥有权的管理其实有很多种方式,比如: Std::auto_ptr 的转移后销毁 Boost::shared_ptr 的引用计数 其实你完成可以设计一个智能指针,让它不主动地释放它们所指的对象,而是去做一些别的什么事
  2. 这里有
  3. 强引用就是被引用的对象活着的话,这个引用也存在。也就是说,当至少存在一个强引用时,那么这个对象就不会被释放,典型的就是 shared_ptr 相对强引用,弱引用只是一个观察者,它不会接受所有权,也不会增加计数器
  4. 当然,还有一些其他的细节: ( 1 )最好不要重载 address-of 操作符 ( 2 )相等性测试和不等性测试 ( 3 )比较 ( 4 )对 Arrary 的支持 ……
  5. 空间上的浪费
  6. 效率上的浪费