`

引用计数简单实现

阅读更多

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

 

 

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++实现 带引用计数的智能指针

    本文将详细讨论如何在C++中实现一种带引用计数的智能指针。 引用计数是一种常见的智能指针策略,它维护了一个内部计数,记录有多少个智能指针指向同一个对象。当智能指针被创建或复制时,计数增加;当智能指针被...

    基于内联汇编原子操作引用计数的CXX智能指针设计与简单实现

    【作品名称】:基于内联汇编原子操作引用计数的CXX智能指针设计与简单实现 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目...

    Swift编程中用以管理内存的自动引用计数详解

    自动引用计数(Automatic Reference Counting,简称ARC)是Swift实现内存管理的一种方式,它自动跟踪并管理对象的生命周期,避免了手动释放内存的繁琐工作。本文将深入探讨Swift中的自动引用计数以及与其相关的概念...

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

    引用计数是智能指针实现中的关键技术之一,用于追踪对象被引用的次数,从而决定何时释放内存。 **智能指针的原理** 智能指针是一个类,它封装了一个原始指针,提供了类似原始指针的接口。当智能指针被复制时,不是...

    C++ 对象计数.rar_counting object_计数

    虽然引用计数提供了一种方便的自动内存管理方式,但它存在一个问题:当两个或多个对象互相引用时,它们的引用计数永远不会降至零,从而导致内存泄漏。解决这个问题的一种方法是使用弱指针(如 `std::weak_ptr`),它...

    iOS内存管理中引用计数的学习

    简单来说,一个对象的引用计数表示了有多少个指针指向它。当对象的引用计数变为0时,系统会认为该对象不再被需要,进而释放其占用的内存。理解引用计数的思考方式是关键: 1. 自己生成的对象,自己持有:当你创建一...

    C++浅拷贝与深拷贝及引用计数分析

    引用计数的实现可以通过shared_ptr来实现,它可以自动统计对象的引用次数,并在对象的引用次数为0时析构对象。 浅拷贝与深拷贝是C++开发中需要注意的问题,解决这些问题的方法有深拷贝和引用计数等,开发者需要根据...

    C++智能指针实现(包含拷贝构造,赋值函数,引用解引用重载)

    在这个实现中,`smartptr`类持有一个原始指针`ptr`和一个引用计数`ref_count`。构造函数初始化`ptr`并设置`ref_count`为1,表示一个智能指针实例存在。 拷贝构造函数是关键,它确保当创建一个新智能指针实例时,...

    深入理解 PHP7 中全新的 zval 容器和引用计数机制

    如果引用计数归零,表明没有其他变量指向该值,垃圾回收机制就会释放内存。 3. **引用(REFERENCE)**:在 PHP7 中,引用不再只是一个标记位,而是一个独立的数据结构 `_zend_reference`。这个结构包含了垃圾收集...

    gc.rar_gc

    - 实现简单:相对于其他垃圾回收策略,如标记-清除或复制算法,引用计数更容易理解和实现。 - 实时性好:一旦对象的引用计数为0,垃圾收集器就能立即释放内存,避免了延迟回收的问题。 - 低开销:在许多情况下,...

    c++ patterns Reference Accounting.pdf

    实现任何引用计数方案都有比个人偏好更多的因素需要考虑。 #### 设计决策 面对不同的上下文和技术背景,开发者会面临不同的权衡,这包括但不限于: - **引用计数的存储位置**:引用计数是否应该嵌入到被计数的...

    MFC实现简单的COM

    - **引用计数**:每次创建或复制对象,其引用计数加一;每次释放或对象不再使用时,引用计数减一,当计数为零时自动销毁对象。 7. **接口的晚绑定和早绑定**: - **晚绑定(Late Binding)**:通过IDispatch接口...

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

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

    Php引用计时器和垃圾回收机制[参照].pdf

    然而,这种方法无法处理循环引用的问题,即两个或更多变量相互引用,但没有其他外部引用,导致这些变量的引用计数永远不为0。 为了解决这个问题,从PHP 5.3开始引入了一种更为复杂的垃圾回收机制,称为"标记-清除...

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

    zend_refcounted结构体包含了引用计数、值类型信息以及垃圾回收的相关信息gc_info和类型标志位flags。 字符串类型在PHP7中的实现是通过zend_string结构体来完成的。这个结构体包含了引用计数的头,一个哈希缓存...

    最简单的COM实现 - 聚合实现

    在学习和实现COM聚合时,深入理解`IUnknown`接口的作用以及如何正确地管理引用计数至关重要。此外,对COM的其他核心概念如接口、CLSID、 IID以及COM对象的生命周期有清晰的认识,也会对理解聚合有所帮助。

    详细描述了Object-C中的内存管理,超级简单

    通过了解和掌握手动引用计数(MRC)的基本原则以及自动引用计数(ARC)的工作方式,开发者可以有效地管理内存,避免内存泄漏和提前释放等问题。虽然ARC大大简化了这一过程,但深入理解引用计数机制仍然是编写高质量...

    Paul mckenny Overview of Linux-Kernel Reference Counting.pdf

    引用计数虽然概念简单,但在实际应用中却有多种变体,适应不同的场景。这种多样性类似于建筑领域中的各种铰链设计,每种铰链都有其特定的应用场景,如银行保险柜的铰链与厨房橱柜的铰链在设计上必然有所不同。同样,...

    python内存管理机制原理详解

    引用计数是最基础的内存管理策略,它简单地记录每个对象被引用的次数。当对象创建时,它的引用计数初始化为1。每当有一个新的引用指向这个对象,引用计数加1;当一个引用失效,计数减1。当对象的引用计数变为0时,...

    智能指针的简单实现

    - **计数**:如果是类似`std::shared_ptr`的实现,可能会包含一个引用计数,每次拷贝或赋值智能指针时增加计数,每次析构或赋值为 nullptr 时减少计数,当计数为零时释放内存。 - **自动解引用**:智能指针通常支持...

Global site tag (gtag.js) - Google Analytics