你说你会C++? —— 智能指针
智能指针能够解决上面遇到的问题。
- class ManagedObj
- {
- public:
- ManagedObj(int val = 0):m_val(val)
- {
- cout<<"Obj : "<<m_val<<endl;
- }
- ~ManagedObj()
- {
- cout<<"~Obj : "<<m_val<<endl;
- }
- void testFun()
- {
- cout<<"testFun : "<<m_info<<endl;
- }
- public:
- string m_info;
- int m_val;
- };
- // std::auto_ptr
- void testAutoPtr1()
- {
- auto_ptr<ManagedObj> atPtr(new ManagedObj(1, " initialize"));
- if (atPtr.get()) // 推断智能指针是否为空
- {
- atPtr->testFun();
- atPtr.get()->m_info += " 1st append"; // get() 返回裸指针的引用
- atPtr->testFun();
- (*atPtr).m_info += " 2nd append"; // operator* 返回智能指针管理的对象
- (*atPtr).testFun();
- }
- }

- void testAutoPtr2()
- {
- auto_ptr<ManagedObj> atPtr(new ManagedObj(1, " initialize"));
- if (atPtr.get()) // 推断智能指针是否为空
- {
- auto_ptr<ManagedObj> atPtr2;
- atPtr2 = atPtr; // 原因在这行代码
- atPtr2->testFun();
- atPtr->testFun(); // 崩溃在这行代码
- }
- }
.png)
- void testAutoPtr3()
- {
- auto_ptr<ManagedObj> atPtr(new ManagedObj(1, " initialize"));
- if (atPtr.get()) // 推断智能指针是否为空
- {
- atPtr.release();
- }
- }
.png)
)
- void testAutoPtr3()
- {
- auto_ptr<ManagedObj> atPtr(new ManagedObj(1, " initialize"));
- if (atPtr.get()) // 推断智能指针是否为空
- {
- //ManagedObj* temp = atPtr.release();
- //delete temp;
- // 或者
- atPtr.reset();
- }
- }
.png)
可是须要注意:
- // boost::scoped_ptr
- void testScopedPtr()
- {
- boost::scoped_ptr<ManagedObj> scPtr(new ManagedObj(1, " initialize"));
- if (scPtr.get())
- {
- scPtr->testFun();
- scPtr.get()->m_info += " 1st append"; // get() 返回裸指针的引用
- scPtr->testFun();
- (*scPtr).m_info += " 2nd append"; // operator* 返回智能指针管理的对象
- (*scPtr).testFun();
- //scPtr.release(); // error scoped_ptr 没有成员release
- //boost::scoped_ptr<ManagedObj> scPtr2;
- //scPtr2 = scPtr; // error scoped_ptr<T>::operator=(const scoped_ptr<ManagedObj> &)不可訪问
- }
- }
.png)
- // boost::shared_ptr
- void testSharedPtr(boost::shared_ptr<ManagedObj> ptr)
- {
- ptr->testFun();
- cout<<"shared_ptr use_count: "<<ptr.use_count()<<endl;
- }
- void testSharedPtr1()
- {
- boost::shared_ptr<ManagedObj> shPtr(new ManagedObj(1, " initialize"));
- if (shPtr.get())
- {
- shPtr->testFun();
- shPtr.get()->m_info += " 1st append"; // get() 返回裸指针的引用
- shPtr->testFun();
- (*shPtr).m_info += " 2nd append"; // operator* 返回智能指针管理的对象
- (*shPtr).testFun();
- }
- cout<<"shared_ptr1 use_count: "<<shPtr.use_count()<<endl;
- testSharedPtr(shPtr);
- cout<<"shared_ptr1 use_count: "<<shPtr.use_count()<<endl;
- //shPtr.release(); // error shared_ptr 没有成员release
- }
.png)
- // boost::scoped_array
- void testScopedArray()
- {
- boost::scoped_array<ManagedObj> scArr(new ManagedObj[2]); // 动态数组初始化
- if (scArr.get())
- {
- scArr[0].testFun();
- scArr.get()[0].m_info += " [0] 1st append";
- scArr[0].testFun();
- //(*scArr)[0].m_info += " 2st append"; // error scoped_array没有重载operator*
- //(*scArr)[0].testFun();
- //scArr[0].release(); // error scoped_array 没有成员release
- boost::scoped_array<ManagedObj> scArr2;
- //scArr2 = scArr; // error operator=不可訪问 屏蔽了operator= 禁止拷贝
- }
- }
.png)
- // boost::shared_array
- void testSharedArray(boost::shared_array<ManagedObj> pArr)
- {
- cout<<"shared_arr use_count: "<<pArr.use_count()<<endl;
- boost::shared_array<ManagedObj> pTempArr;
- pTempArr = pArr;
- cout<<"shared_arr use_count: "<<pArr.use_count()<<endl;
- }
- void testSharedArray1()
- {
- boost::shared_array<ManagedObj> shArr(new ManagedObj[2]);
- if (shArr.get())
- {
- shArr[0].testFun();
- shArr.get()[0].m_info += " [0] 1st append";
- shArr[0].testFun();
- shArr[1].testFun();
- shArr.get()[0].m_info += " [1] 1st append";
- shArr[1].testFun();
- //(*shArr)[0].m_info += " [0] 2nd append"; // error 没有重载operator*操作符
- }
- cout<<"shared_arr1 use_count: "<<shArr.use_count()<<endl;
- testSharedArray(shArr);
- cout<<"shared_arr1 use_count: "<<shArr.use_count()<<endl;
- }
.png)
- // boost::weak_ptr
- void testWeakPtr()
- {
- boost::weak_ptr<ManagedObj> wPtr;
- boost::shared_ptr<ManagedObj> shPtr(new ManagedObj(1, "initialize"));
- cout << "testWeakPtr boost::shared_ptr UseCount: " << shPtr.use_count() << endl;
- wPtr = shPtr;
- cout << "testWeakPtr boost::shared_ptr UseCount: " << shPtr.use_count() << endl;
- }
.png)
.png)
OK 到这儿为止,七种智能指针基本上都大致介绍完了。
參考:
http://blog.csdn.net/xt_xiaotian/article/details/5714477
完整的代码在这里。
- #include <iostream>
- #include <memory>
- #include <string>
- #include <boost/smart_ptr.hpp> // add header file
- // namespace
- using namespace std;
- using namespace boost;
- // heap obj class
- class ManagedObj
- {
- public:
- ManagedObj(int val = 0, string info = "")
- :m_val(val), m_info(info)
- {
- cout<<"Obj : "<<m_val<<m_info<<endl;
- }
- ~ManagedObj()
- {
- cout<<"~Obj : "<<m_val<<m_info<<endl;
- }
- void testFun()
- {
- cout<<"testFun : "<<m_info<<endl;
- }
- public:
- string m_info;
- int m_val;
- };
- // std::auto_ptr
- void testAutoPtr1()
- {
- auto_ptr<ManagedObj> atPtr(new ManagedObj(1, " initialize"));
- if (atPtr.get()) // 推断智能指针是否为空
- {
- atPtr->testFun();
- atPtr.get()->m_info += " 1st append"; // get() 返回裸指针的引用
- atPtr->testFun();
- (*atPtr).m_info += " 2nd append"; // operator* 返回智能指针管理的对象
- (*atPtr).testFun();
- }
- }
- void testAutoPtr2()
- {
- auto_ptr<ManagedObj> atPtr(new ManagedObj(1, " initialize"));
- if (atPtr.get()) // 推断智能指针是否为空
- {
- auto_ptr<ManagedObj> atPtr2;
- atPtr2 = atPtr;
- atPtr2->testFun();
- atPtr->testFun();
- }
- }
- void testAutoPtr3()
- {
- auto_ptr<ManagedObj> atPtr(new ManagedObj(1, " initialize"));
- if (atPtr.get()) // 推断智能指针是否为空
- {
- //ManagedObj* temp = atPtr.release();
- //delete temp;
- // 或者
- atPtr.reset();
- }
- }
- // boost::scoped_ptr
- void testScopedPtr()
- {
- boost::scoped_ptr<ManagedObj> scPtr(new ManagedObj(1, " initialize"));
- if (scPtr.get())
- {
- scPtr->testFun();
- scPtr.get()->m_info += " 1st append"; // get() 返回裸指针的引用
- scPtr->testFun();
- (*scPtr).m_info += " 2nd append"; // operator* 返回智能指针管理的对象
- (*scPtr).testFun();
- //scPtr.release(); // error scoped_ptr 没有成员release
- //boost::scoped_ptr<ManagedObj> scPtr2;
- //scPtr2 = scPtr; // error scoped_ptr<T>::operator=(const scoped_ptr<ManagedObj> &)不可訪问
- }
- }
- // boost::shared_ptr
- void testSharedPtr(boost::shared_ptr<ManagedObj> ptr)
- {
- ptr->testFun();
- cout<<"shared_ptr use_count: "<<ptr.use_count()<<endl;
- }
- void testSharedPtr1()
- {
- boost::shared_ptr<ManagedObj> shPtr(new ManagedObj(1, " initialize"));
- if (shPtr.get())
- {
- shPtr->testFun();
- shPtr.get()->m_info += " 1st append"; // get() 返回裸指针的引用
- shPtr->testFun();
- (*shPtr).m_info += " 2nd append"; // operator* 返回智能指针管理的对象
- (*shPtr).testFun();
- }
- cout<<"shared_ptr1 use_count: "<<shPtr.use_count()<<endl;
- testSharedPtr(shPtr);
- cout<<"shared_ptr1 use_count: "<<shPtr.use_count()<<endl;
- //shPtr.release(); // error shared_ptr 没有成员release
- }
- // boost::scoped_array
- void testScopedArray()
- {
- boost::scoped_array<ManagedObj> scArr(new ManagedObj[2]); // 动态数组初始化
- if (scArr.get())
- {
- scArr[0].testFun();
- scArr.get()[0].m_info += " [0] 1st append";
- scArr[0].testFun();
- //(*scArr)[0].m_info += " 2st append"; // error scoped_array没有重载operator*
- //(*scArr)[0].testFun();
- //scArr[0].release(); // error scoped_array 没有成员release
- boost::scoped_array<ManagedObj> scArr2;
- //scArr2 = scArr; // error operator=不可訪问 屏蔽了operator= 禁止拷贝
- }
- }
- // boost::shared_array
- void testSharedArray(boost::shared_array<ManagedObj> pArr)
- {
- cout<<"shared_arr use_count: "<<pArr.use_count()<<endl;
- boost::shared_array<ManagedObj> pTempArr;
- pTempArr = pArr;
- cout<<"shared_arr use_count: "<<pArr.use_count()<<endl;
- }
- void testSharedArray1()
- {
- boost::shared_array<ManagedObj> shArr(new ManagedObj[2]);
- if (shArr.get())
- {
- shArr[0].testFun();
- shArr.get()[0].m_info += " [0] 1st append";
- shArr[0].testFun();
- shArr[1].testFun();
- shArr.get()[1].m_info += " [1] 1st append";
- shArr[1].testFun();
- //(*shArr)[0].m_info += " [0] 2nd append"; // error 没有重载operator*操作符
- }
- cout<<"shared_arr1 use_count: "<<shArr.use_count()<<endl;
- testSharedArray(shArr);
- cout<<"shared_arr1 use_count: "<<shArr.use_count()<<endl;
- }
- // boost::weak_ptr
- void testWeakPtr()
- {
- boost::weak_ptr<ManagedObj> wPtr;
- boost::shared_ptr<ManagedObj> shPtr(new ManagedObj(1, "initialize"));
- cout << "testWeakPtr boost::shared_ptr UseCount: " << shPtr.use_count() << endl;
- wPtr = shPtr;
- cout << "testWeakPtr boost::shared_ptr UseCount: " << shPtr.use_count() << endl;
- }
- // boost::intrusive_ptr
- void testIntrusivePtr()
- {
- //boost::intrusive_ptr<ManagedObj> intPtr(new ManagedObj[1], false); // error 要自己加入引用计数
- }
- // main function
- int main(void)
- {
- // -----std::auto_ptr-----
- //testAutoPtr();
- //testAutoPtr2();
- //testAutoPtr3();
- // -----boost::scoped_ptr-----
- //testScopedPtr();
- // -----boost::shared_ptr-----
- //testSharedPtr1();
- // -----boost::scoped_array-----
- //testScopedArray();
- // -----boost::shared_array-----
- //testSharedArray1();
- // -----boost::weak_ptr-----
- testWeakPtr();
- return 0;
- }
你说你会C++? —— 智能指针的更多相关文章
- enote笔记法使用范例(2)——指针(1)智能指针
要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...
- C++11 shared_ptr 智能指针 的使用,避免内存泄露
多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...
- C++智能指针
引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...
- EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针
一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...
- 智能指针shared_ptr的用法
为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...
- 智能指针unique_ptr的用法
unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...
- 基于C/S架构的3D对战网络游戏C++框架_05搭建系统开发环境与Boost智能指针、内存池初步了解
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- C++ 引用计数技术及智能指针的简单实现
一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧).最近花了点时间认真看了智能指针,特地来写这篇文章. 1.智能指针是什么 简单来说,智能指针是一个类,它对普 ...
- C++11智能指针读书笔记;
智能指针是一个类对象,而非一个指针对象. 原始指针:通过new建立的*指针 智能指针:通过智能指针关键字(unique_ptr, shared_ptr ,weak_ptr)建立的指针 它的一种通用实现 ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
随机推荐
- 什么是老板思维,什么是员工思维,深有体会,最近被N个行业洗脑……
什么是老板思维,什么是员工思维,深有体会,最近被N个行业洗脑……
- BZOJ1835: [ZJOI2010]base 基站选址(线段树优化Dp)
Description 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄 ...
- Linux 创建新用户并添加到sudo用户组
附上一份相当奢华的文档: https://www.cnblogs.com/jxhd1/p/6528574.html 添加用户到组 usermod -a -G sudo newone
- ZOJ 3674 Search in the Wiki(字典树 + map + vector)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4917 题意:每一个单词都一些tips单词. 先输入n个单词和他们的t ...
- actionbar-去掉背景的阴影
今天发现一个问题,就是actionbar跟界面的交界处,会有一个阴影,通过调查发现,这个阴影是actionbar的.然后通过在网上找资料,完美解决了问题.解决方法如下 1.在这个actionbar所在 ...
- Impala的安装(含使用CM安装 和 手动安装)(图文详解)
Impala有两种安装方式: 1)使用CM安装Impala 2)手动安装Impala 注意:Impala不支持在Debian/Ubuntu, SuSE, RHEL/CentOS 6.5系统中安装. 基 ...
- js上传文件(图片)的格式和大小限制
如果你想快速解决这个问题,看本文就够了.查了好多资料,终于解决了,太耗时间了,本文留给给后来者,希望你们工作的更轻松 本文保存为.html文件用浏览器打开即可测试功能 <form id=&quo ...
- (转)Linux下查看Nginx Apache MySQL的并发连接数和连接状态
转自: http://www.ha97.com/4106.html 1.查看Web服务器(Nginx Apache)的并发请求数及其TCP连接状态:netstat -n | awk '/^tcp/ { ...
- WPF MVVM示例自定义模板数据绑定
在触摸屏设备上.由于列表是的信息展示不是非常直观和便捷操作. 所以也就出现了很多用面板控件:类似win10的Metro风格, 所以抽空做了一个WPF面板控件. 话不多上 , 先上一个示例图. 为了便于 ...
- mycat基本概念及读写分离一
mycat基本概念及读写分离一 目录(?)[+] 安装与启动 mycat目录介绍 mycat三个最重要配置文件 验证读写分离 安装与启动 linux下可以下载Mycat-server-xxxxx.li ...