`

引用计数简单实现

阅读更多

延迟销毁资源,不具备写时复制功能,贴出代码

 

 

class DataSource
{
private:
	volatile unsigned int *m_pICount;
	double *m_pData;

public:
	DataSource(double *pData);
	~DataSource();
	DataSource(const DataSource &ds);
	DataSource& operator =(const DataSource &ds);
	bool operator ==(const DataSource &ds) const;
	bool operator !=(const DataSource &ds) const;

private:
	void release();
};

 

 

 

DataSource::DataSource(double *pData): m_pICount(new unsigned int(1)), m_pData(pData)
{
}

DataSource::~DataSource()
{
	release();
}

DataSource::DataSource(const DataSource &ds): m_pICount(ds.m_pICount), m_pData(ds.m_pData)
{
	if(*this == ds)
		return;

	++(*m_pICount);
}

DataSource& DataSource::operator =(const DataSource &ds)
{
	if(*this == ds)
		return *this;

	this->release();
	m_pData = ds.m_pData;
	m_pICount = ds.m_pICount;
	++(*m_pICount);

	return *this;
}

bool DataSource::operator ==(const DataSource &ds) const
{
	return (m_pICount == ds.m_pICount && m_pData == ds.m_pData);
}

bool DataSource::operator !=(const DataSource &ds) const
{
	return (m_pICount != ds.m_pICount);
}

void DataSource::release()
{
	if(0 == --(*m_pICount))
	{
		delete m_pICount;
		delete m_pData;

		m_pICount = NULL;
		m_pData = NULL;
	}
}
1
1
分享到:
评论

相关推荐

    C++ 引用计数技术及智能指针的简单实现

     简单来说,智能指针是一个类,它对普通指针进行封装,使智能指针类对象具有普通指针类型一样的操作。具体而言,复制对象时,副本和原对象都指向同一存储区域,如果通过一个副本改变其所指的值,则通过另一对象...

    xalanjava源码-rcjp:使用ASM库检测Java字节码,实现一个简单的引用计数模型来测试Java程序

    字节码,实现一个简单的引用计数模型来测试 Java 程序。 描述 rcjp 是引用计数 Java 程序的缩写。 本项目旨在从Java程序中发现Whole-Part关系中存在的一些详细属性。 构建检测程序以跟踪 Java 程序中实例的行为并...

    《垃圾收集》(Garbage Collection)扫描版[PDF]——part2

    10.6.8 一个简单的引用计数指针 10.6.9 用于灵活的垃圾收集的智能指针 10.6.10 用于追踪式垃圾收集的智能指针 10.7 为支持垃圾收集而修改C++ 10.8 Ellis和Detlefs的建议 10.9 终结机制 10.10 需要考虑的问题 10.11 ...

    (Garbage Collection)扫描版——part1

    10.6.8 一个简单的引用计数指针 10.6.9 用于灵活的垃圾收集的智能指针 10.6.10 用于追踪式垃圾收集的智能指针 10.7 为支持垃圾收集而修改C++ 10.8 Ellis和Detlefs的建议 10.9 终结机制 10.10 需要考虑的问题 10.11 ...

    基于遗传算法的排课系统,含论文(排课 遗传算法 设计模式 智能指针 报表)

    采用了智能指针技术(没有使用boost库的引用计数型智能指针,而是参考C++沉思录自己实现的),提高了效率,有利于防止内存泄露。个人也建议在看boost库前先看看C++沉思录,大师的经典,对以后很多技术的实现都有影响...

    内存管理内存管理内存管理

    文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半手工地管理内存,以及如何使用垃圾收集自动管理内存。 为什么必须管理内存 内存管理是计算机编程最为基本的...

    com自学视频教程

    2、引用计数的原理 3、AddRef与Release的实现与使用 4、引用计数的优化 IDispatch接口与Variant类型 内容提要: 1、IDispatch的简介与作用 2、常用的COM数据类型 3、COM数据类型的转换 4、VARIANT类型的派生...

    操作系统(内存管理)

    文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半手工地管理内存,以及如何使用垃圾收集自动管理内存。 为什么必须管理内存 内存管理是计算机编程最为基本的...

    baserver服务器框架C++ Tcp server

    3、封装处理各种I/O操作及状态,采用无共享锁/无引用计数设计,控制逻辑清晰、简单,用户应用程序无须关心I/O操作细节,只需要关心业务逻辑的具体实现; 4、提供多级tcp server访问处理机制,非常容易实现各种代理...

    变量在PHP7内部的实现(二)

    这里再重复一下,主要的变化就是zval不再单独分配内存,不自己存储引用计数。整型浮点型等简单类型直接存储在zval中。复杂类型则通过指针指向一个独立的结构体。复杂的zval数据值有一个共同的头,其结构由zend_...

    Python tornado队列示例-一个并发web爬虫代码分享

    在一个queue内部维护了一个未完成任务的引用计数,每调用一次put操作便会增加引用计数,而调用task_done操作将会减少引用计数。 下面是一个简单的web爬虫的例子: 最开始,queue只包含一个基准url。当一个worker从中...

    二十三种设计模式迷你手册

    你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。一个简单的例子便是C o p l i e n 的S t r i n g 类[ C o p 9 2 ],在这个类中多个对象可以共享同一个字符串表示(S t r i n g R e p...

    lisp:我的旧的Lisp实现---有关最新的和维护的实现,请参见funlisp

    我已经实现了lambda函数和函数调用,基本的整数算术,简单的列表操作,if语句,甚至还建立了基本的垃圾收集系统(通过引用计数)。 试用起来很容易(见下文)。 运行! 如果您具有Unix-y开发环境,则应该很容易...

    TCP/IP详解卷2:实现

    2.9m_copy和簇引用计数 2.10其他选择 2.11小结 第3章接口层 3.1引言 3.2代码介绍 3.2.1全局变量 3.2.2SNMP变量 3.3ifnet结构 3.4ifaddr结构 3.5sockaddr结构 3.6ifnet与ifaddr的专用化 3.7网络初始化概述 3.8以太网...

    TCP-IP详解卷二 实现(高清书签版).part1.rar

     2.9 m_copy和簇引用计数  2.10 其他选择  2.11 小结 第3章 接口层 3.1 引言 3.2 代码介绍  3.2.1 全局变量  3.2.2 SNMP变量 3.3 ifnet结构 3.4 ifaddr结构 3.5 sockaddr结构 3.6 ifnet与ifaddr的...

    COM技术内幕——微软组件对象模型--随书源代码

    4.3.1 引用计数的优化 60 4.3.2 引用计数规则 63 4.4 本章小结 65 第5章 动态链接 66 5.1 组件的创建 66 5.1.1 从DLL中输出函数 67 5.1.2 DLL的装载 69 5.2 客户和组件的划分 71 5.2.1 程序清单 72 5.3 ...

    TCP-IP详解卷二 实现(高清书签版).part2.rar

     2.9 m_copy和簇引用计数  2.10 其他选择  2.11 小结 第3章 接口层 3.1 引言 3.2 代码介绍  3.2.1 全局变量  3.2.2 SNMP变量 3.3 ifnet结构 3.4 ifaddr结构 3.5 sockaddr结构 3.6 ifnet与ifaddr的...

    TCP-IP详解卷二 实现(高清书签版).part3.rar

     2.9 m_copy和簇引用计数  2.10 其他选择  2.11 小结 第3章 接口层 3.1 引言 3.2 代码介绍  3.2.1 全局变量  3.2.2 SNMP变量 3.3 ifnet结构 3.4 ifaddr结构 3.5 sockaddr结构 3.6 ifnet与ifaddr的...

    深入理解理解java虚拟机

     实现简单,判定效率很高。但是很难解决对象之间循环引用的问题。  2,可达性分析算法:  java所使用的垃圾回收算法。  基本思想:通过一系列的名为“GC Root”的对象作为起点,从这些节点向下搜索,搜索所...

    TCP/IP详解 (卷2:实现)

     2.9 m_copy和簇引用计数  2.10 其他选择  2.11 小结 第3章 接口层 3.1 引言 3.2 代码介绍  3.2.1 全局变量  3.2.2 SNMP变量 3.3 ifnet结构 3.4 ifaddr结构 3.5 sockaddr结构 3.6 ifnet与ifaddr的...

Global site tag (gtag.js) - Google Analytics