文档章节

智能指针

大大美女女
 大大美女女
发布于 2014/06/04 17:48
字数 220
阅读 137
收藏 7
点赞 0
评论 0

闲着没事写了个智能指针

#include <iostream>


class SmartCount {
  public:
    explicit SmartCount(int count) : count_(0) {
      count_ = count;
    }
  private:
    explicit SmartCount(const SmartCount&);
    SmartCount& operator = (const SmartCount&);
  public:
    int AddCount() {return ++count_;}
    int Release() {return --count_;}
  private:
    int count_;

};

template<class T>
class SmartPtr {
  public:
    SmartPtr(T* ptr):ptr_(ptr),counter_(new SmartCount(1)) {
      
    }

    ~SmartPtr() {
      if (ptr_ && counter_->Release() <= 0) {
        delete ptr_;
        ptr_ = NULL;
        delete counter_;
        counter_ = NULL;
      }
    }

  public:
    SmartPtr(const SmartPtr<T>& smart_ptr) {
      ptr_ = smart_ptr.ptr_;
      counter_ = smart_ptr.counter_;
      if (counter_) {
        counter_->AddCount();
      }
    } 


    SmartPtr& operator = (const SmartPtr<T>& smart_ptr) {
      if (&smart_ptr == this) {
        return *this;
      }
      if (smart_ptr.counter_) {
        smart_ptr.counter_->AddCount();
      }
      T* ptr_temp = ptr_;
      SmartCount* count_temp = counter_;
      ptr_ = smart_ptr.ptr_;
      counter_ = smart_ptr.counter_;
      if (ptr_temp && count_temp->Release() <= 0) {
        delete ptr_temp;
        ptr_temp = NULL;
        delete count_temp;
        count_temp = NULL;
      }
      return *this;
    }

    T* operator -> (void) {
      return ptr_;
    }

    T& operator * (void) {
      return *ptr_;
    }

    


  private:
    T* ptr_;
    SmartCount* counter_;
};

#include "main.h"

using namespace std;

class Test {
  public:
    Test(char* ch) {ch_ = ch;}
    ~Test() { }

    void Print() {
      cout << ch_ << endl;
      cout << "333333" << endl;
    }
  private:
    char* ch_;

};

int main(int argc, char* argv[]) {
 SmartPtr<Test> p ( new Test("123"));
 p->Print();

 SmartPtr<Test> p2(new Test("333"));
 p2 = p;
 p2->Print();

 SmartPtr<Test> p3(p2);
 p3->Print();
}


骑虎100 一个有趣的网站 好玩的网站 http://www.qihu100.com


© 著作权归作者所有

共有 人打赏支持
大大美女女
粉丝 18
博文 60
码字总数 24479
作品 0
昌平
程序员

暂无相关文章

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 26分钟前 ⋅ 0

全量构建和增量构建的区别

1.全量构建每次更新时都需要更新整个数据集,增量构建只对需要更新的时间范围进行更新,所以计算量会较小。 2.全量构建查询时不需要合并不同Segment,增量构建查询时需要合并不同Segment的结...

无精疯 ⋅ 36分钟前 ⋅ 0

如何将S/4HANA系统存储的图片文件用Java程序保存到本地

我在S/4HANA的事务码MM02里为Material维护图片文件作为附件: 通过如下简单的ABAP代码即可将图片文件的二进制内容读取出来: REPORT zgos_api.DATA ls_appl_object TYPE gos_s_obj.DA...

JerryWang_SAP ⋅ 54分钟前 ⋅ 0

云计算的选择悖论如何对待?

导读 人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云...

问题终结者 ⋅ 今天 ⋅ 0

637. Average of Levels in Binary Tree - LeetCode

Question 637. Average of Levels in Binary Tree Solution 思路:定义一个map,层数作为key,value保存每层的元素个数和所有元素的和,遍历这个树,把map里面填值,遍历结束后,再遍历这个map,把每...

yysue ⋅ 今天 ⋅ 0

IDEA配置和使用

版本控制 svn IDEA版本控制工具不能使用 VCS-->Enable Version Control Integration File-->Settings-->Plugins 搜索Subversion,勾选SVN和Git插件 删除.idea文件夹重新生成项目 安装SVN客户......

bithup ⋅ 今天 ⋅ 0

PE格式第三讲扩展,VA,RVA,FA的概念

作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶VA概念 VA (virtual Address) 虚拟地址的意思 ,比如随便打开一个PE,找下它的虚拟地址 这边...

simpower ⋅ 今天 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 今天 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 今天 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部