版权声明:本文为博主原创文章,未经博主允许不得转载。

shared_ptr智能指针的一种,它的使用类似于auto_ptr.

shared_ptr它有两个指针,一个指向引用计数,一个指向data.由于拥有引用计数,所有shared_ptr支持容器.

shared_ptr的源码非常复杂这里也不做太多讲解,本文主要介绍一下shared_ptr的基本使用

间接使用

#include <iostream>

using namespace std;

class Person
{
public:
Person()
{
cout<< "ctor" << endl;
}
~Person()
{
cout<< "dctor" << endl;
} int m_age = ;
}; int main()
{
shared_ptr<Person> person(new Person());
cout << (*person).m_age<< endl;
cout << "引用计数: " << person.use_count() << endl; // use_count()返回几个该对象被几个人拥有 return ;
}

输出结果


直接使用

int main()
{
//赋值操作
int *p = new int ();
int *q = new int (); shared_ptr<int> tmp_5(p);
shared_ptr<int> tmp_10(q); tmp_5 = tmp_10;
cout<< * tmp_5 << endl; return ; }

输出结果


检测拥有者

int main()
{
//unique() 是否为最初拥有者
Person * p = new Person; shared_ptr<Person> tmp_1(p);
cout <<"被拥有个数"<< tmp_1.use_count() <<"是否为最初拥有者"<<tmp_1.unique()<< endl; shared_ptr<Person> tmp_2(tmp_1);
cout <<"被拥有个数"<< tmp_2.use_count() <<"是否为最初拥有者"<<tmp_2.unique()<< endl; return ;
}

输出结果


以上是shared_ptr<>的简单使用

下面我来介绍一种类的设计方式Hand/Body(pImpl)

这边设计方式其实就是桥接设计模式,但是个人感觉这种设计类的方式是未来的趋向

他的观点如图

(handle) fileview类只含有一个指针(4字节),指向真正的数据

(body) implementation, 数据 , 方法实现

这样做 handle 内存占用大小会减小很多,并且他有助于move()的实现

此时调用fileview的function时就会调用 implementation内的实现

写一个简单的实现

#include <iostream>
#include <vector>
#include "/Users/oujiken/Qt5.6.1/5.6/Src/qt3d/src/3rdparty/assimp/code/BoostWorkaround/boost/shared_ptr.hpp"
using namespace std; class fileview
{
public:
fileview();
~fileview();
void fileview_close();
   ...
private:
struct implementation;
boost::shared_ptr<implementation> pimpl;
}; struct fileview::implementation
{
std::vector<char> m_data;
}; //ctor
fileview::fileview()
{
pimpl.reset(new implementation());
cout<< "fileview()" <<endl;
} void fileview::fileview_close()
{
pimpl->m_data.clear();
cout<< "close()"<<endl;
}
...
int main()
{
fileview * f = new fileview();
f->fileview_close();
   cout << sizeof(fileview) <<endl;
return ;
}

输出结果

shared_ptr<> 占16字节

如有不正确的地方请指正

参照<<侯捷 C++新标准 C++11>>

C++11_shared_ptr的更多相关文章

随机推荐

  1. linux内核动态打印

    参考:https://www.cnblogs.com/pengdonglin137/p/4622460.html https://linux.cn/article-3682-1.html?pr 如何打 ...

  2. ES6、7、8常用新特性总结(超实用)

    ES6常用新特性 1. let && const let 命令也用于变量声明,但是作用域为局部 { let a = 10; var b = 1; } 在函数外部可以获取到b,获取不到a ...

  3. Python解析JSON数据的基本方法

    转自:http://www.jb51.net/article/73450.htm JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScri ...

  4. Spring笔记2——Spring中Bean的装配

    1.引言 Spring中,对象无需自己负责查找或创建与其关联的其他对象,而是由容器负责把需要相互协作的对象引用赋予各个对象.创建应用对象之间的协作关系的行为通常称为装配(Wiring),这也是依赖注入 ...

  5. Caffe学习笔记(三):Caffe数据是如何输入和输出的?

    Caffe学习笔记(三):Caffe数据是如何输入和输出的? Caffe中的数据流以Blobs进行传输,在<Caffe学习笔记(一):Caffe架构及其模型解析>中已经对Blobs进行了简 ...

  6. 迟到的thuwc&noiwc2018总结

    已经4个多月没写博客了呢. thuwc和noiwc都炸了,接下来的一段时间都没怎么写题,靠文化课和游戏麻醉自己.这篇博客也算是向之前自闭.颓废的自己告别吧.. 先写一发游记: thuwc:Day1炸, ...

  7. springboot idea 配置热加载

    在idea 配置springboot的热加载,只需要三步: 第一步.引用jar包 <dependency> <groupId>org.springframework.boot& ...

  8. Android -- 两个activity界面的切换, 显示Intent 和 隐式Intent,putExtra传递数据

    1. 两个Activity之间可以通过Intent切换, 包括显示Intent 和 隐式Intent. 实例代码 MainActivity.java public class MainActivity ...

  9. Dive into Spring framework -- 了解基本原理(一)

    在继续我们的分析之前,推荐各位静心来读一下<<Expert_OneOne_J2EE_Design_and_Development>> 第四章, 正如spring BeanFac ...

  10. Nginx与PHP(FastCGI)的安装、配置

    摘自:http://www.linuxde.net/2012/03/9130.html 一.什么是 FastCGI FastCGI是一个可伸缩地.高速地在HTTP server和动态脚本语言间通信的接 ...