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

EDUC6506(001)_ClassPresentation_2_TC330277 (1).pptx
EDUC6506(001)_ClassPresentation_2_TC330277 (1).pptxEDUC6506(001)_ClassPresentation_2_TC330277 (1).pptx
EDUC6506(001)_ClassPresentation_2_TC330277 (1).pptxmekosin001123
 
哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制
哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制
哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制jakepaige317
 
泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书
泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书
泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书jakepaige317
 
educ6506presentationtc3302771-240427173057-06a46de5.pptx
educ6506presentationtc3302771-240427173057-06a46de5.pptxeduc6506presentationtc3302771-240427173057-06a46de5.pptx
educ6506presentationtc3302771-240427173057-06a46de5.pptxmekosin001123
 
EDUC6506_ClassPresentation_TC330277 (1).pptx
EDUC6506_ClassPresentation_TC330277 (1).pptxEDUC6506_ClassPresentation_TC330277 (1).pptx
EDUC6506_ClassPresentation_TC330277 (1).pptxmekosin001123
 
1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...
1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...
1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...黑客 接单【TG/微信qoqoqdqd】
 

Recently uploaded (6)

EDUC6506(001)_ClassPresentation_2_TC330277 (1).pptx
EDUC6506(001)_ClassPresentation_2_TC330277 (1).pptxEDUC6506(001)_ClassPresentation_2_TC330277 (1).pptx
EDUC6506(001)_ClassPresentation_2_TC330277 (1).pptx
 
哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制
哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制
哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制
 
泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书
泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书
泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书
 
educ6506presentationtc3302771-240427173057-06a46de5.pptx
educ6506presentationtc3302771-240427173057-06a46de5.pptxeduc6506presentationtc3302771-240427173057-06a46de5.pptx
educ6506presentationtc3302771-240427173057-06a46de5.pptx
 
EDUC6506_ClassPresentation_TC330277 (1).pptx
EDUC6506_ClassPresentation_TC330277 (1).pptxEDUC6506_ClassPresentation_TC330277 (1).pptx
EDUC6506_ClassPresentation_TC330277 (1).pptx
 
1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...
1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...
1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...
 

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. 效率上的浪费