shared_ptr的简单实现

前面讲到auto_ptr有个很大的缺陷就是所有权的转移,就是一个对象的内存块只能被一个智能指针对象所拥有.但我们有些时候希望共用那个内存块.于是C++ 11标准中有了shared_ptr这样的智能指针,顾名思义,有个shared表明共享嘛.所以shared_ptr类型的智能指针可以做为STL容器的元素

下面我们来瞧瞧shared_ptr具体是咋实现的.相较auto_ptr有下面几个不同的地方:

1.引进了一个计数器shared_count,用来表示当前有多少个智能指针对象共享指针指向的内存块

2.析构函数中不是直接释放指针对应的内存块,如果shared_count大于1则不释放内存只是将引用计数减1,只是计数等于1时释放内存

3.复制构造与赋值操作符只是提供一般意义上的复制功能,并且将引用计数加1.

shared_ptr实现代码(只实现核心功能)

#include <iostream>

using namespace std;

template<class T>

class shared_ptr{

private:

T* m_ptr; //被封装的指针

unsigned int shared_count;   //引用计数,表示有多少个智能指针对象拥有m_ptr指向的内存块

public:

shared_ptr(T* p):m_ptr(p),shared_count(1){ }

~shared_ptr() { deconstruct();}

void deconstruct(){

if(shared_count == 1)   //引用计数为1表示只有一个对象使用指针指向的内存块了

{

delete m_ptr;

m_ptr = 0;

}

shared_count--;

}

T& operator*() { return *m_ptr;}

T* operator->() { return m_ptr;}

//复制构造函数

shared_ptr(shared_ptr& sp):m_ptr(sp.m_ptr),shared_count(sp.shared_count){

shared_count++;

}

//重载运算符=

shared_ptr& operator = (shared_ptr& sp){

sp.shared_count++;   

deconstruct();  //相当于先删掉左值,然后再通过右值赋值.

m_ptr = sp.m_ptr;

shared_count = sp.shared_count;

return *this;

} 

};
时间: 2024-08-01 22:46:44

shared_ptr的简单实现的相关文章

格式工厂(六)shared_ptr

版权声明:本文为博主原创文章,未经博主允许不得转载. shared_ptr智能指针的一种,它的使用类似于auto_ptr. shared_ptr它有两个指针,一个指向引用计数,一个指向data.由于拥有引用计数,所有shared_ptr支持容器. shared_ptr的源码非常复杂这里也不做太多讲解,本文主要介绍一下shared_ptr的基本使用 间接使用 #include <iostream> using namespace std; class Person { public: Perso

C++之shared_ptr总结

Share_ptr也是一种智能指针.类比于auto_ptr学习.所以推荐先学习auto_ptr,再来学习shared_ptr.本博客的前两个就是auto_ptr的总结.希望感兴趣的朋友可以看看. Shared_ptr和auto_ptr最大的区别就是,shared_ptr解决了指针间共享对象所有权的问题,也就是auto_ptr中的赋值的奇怪问题.所以满足了容器的要求,可以用于容器中.而auto_ptr显然禁止共享对象所有权,不可以用于容器中. int * a=new int(2); shared_

C++11学习

C++11学习 本章目的: 当Android用ART虚拟机替代Dalvik的时候,为了表示和Dalvik彻底划清界限的决心,Google连ART虚拟机的实现代码都切换到了C++11.C+11的标准规范于2011年2月正式落稿,而此前10余年间,C++正式标准一直是C++98/03[①].相比C++98/03,C++11有了非常多的变化,甚至一度让笔者大呼不认识C++了[②].不过,作为科技行业的从业者,我们要铭记在心的一个铁规就是要拥抱变化.既然我们不认识C++11,那就把它当做一门全新的语言来

【c++工程实践】智能指针

一.智能指针简介 a smart pointer is an abstract data type that simulates a pointer while providing added features, such as automatic memory management or bounds checking. 智能指针和普通指针的区别在于智能指针实际上是对普通指针加了一层封装机制,这样的一层封装机制的目的是为了使得智能指针可以方便的管理一个对象的生命期. 在C++中,我们知道,如果

简单的shared_ptr实现

RT,代码参考了STL中shard_ptr的实现,基本原理是引用计数,利用Ref_cnt类来管理内存,在shared_ptr创建时创建,此后shared_ptr仅是在拷贝复制析构的过程中对引用进行修改,个人觉得比较有意思的一个地方在于通过对Ref_cnt类多态的应用使得shared_ptr无需额外增加模板参数这个想法(我原来想利用默认模板参数的方法感觉既不灵活又麻烦). #ifndef _TSHARED_PTR_ #define _TSHARED_PTR_ #include <cstdlib>

实现一个简单的shared_ptr

template <typename T> class shared_ptr { public: explicit shared_ptr (T *ptr): mPtr(ptr), cnt(new int(1)){} shared_ptr(const shared_ptr& rhs): mPtr(rhs.mPtr), cnt(rhs.cnt){ ++*cnt; } shared_ptr& operator = (const shared_ptr&); ~shared_pt

智能指针的原理和简单实现

什么是智能指针? 智能指针实质上是一个类,定义一个类来封装资源的分配和释放.这个类的构造函数中传入一个指针,完成资源的分配和初始化.在析构函数中释放传入的该指针,完成资源的释放. 为什么要用智能指针? 智能指针就是智能,自动化的管理指针所指向的动态资源. 例如以下情况:代码中经常会忘记释放动态开辟的内存资源,导致内存泄露. // case1 void Test2() {  int* p1 = new int(2);  bool isEnd = true;  //...  if (isEnd)  

C++智能指针简单剖析

导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题,比如你知道哪些智能指针?shared_ptr的设计原理是什么?如果让你自己设计一个智能指针,你如何完成?等等--.而且在看开源的C++项目时,也能随处看到智能指针的影子.这说明智能指针不仅是面试官爱问的题材,更是非常有实用价值. 下面是我在看智能指针时所做的笔记,希望能够解决你对智能指针的一些困扰. 目录

C++智能指针剖析(下)boost::shared_ptr&amp;其他

1. boost::shared_ptr 前面我已经讲解了两个比较简单的智能指针,它们都有各自的优缺点.由于 boost::scoped_ptr 独享所有权,当我们真真需要复制智能指针时,需求便满足不了了,如此我们再引入一个智能指针,专门用于处理复制,参数传递的情况,这便是如下的boost::shared_ptr. boost::shared_ptr 属于 boost 库,定义在 namespace boost 中,包含头文件#include<boost/smart_ptr.hpp> 便可以使