引用计数

转载 2013年12月01日 20:45:48
#include<iostream>  
using namespace std;  

// 定义仅由HasPtr类使用的U_Ptr类,用于封装使用计数和相关指针  
// 这个类的所有成员都是private,我们不希望普通用户使用U_Ptr类,所以它没有任何public成员  
// 将HasPtr类设置为友元,使其成员可以访问U_Ptr的成员  
class U_Ptr  
{  
	friend class HasPtr;  
	int *ip;  
	size_t use;  
	U_Ptr(int *p) : ip(p) , use(1)  
	{  
		cout << "U_ptr constructor called !" << endl;  
	}  
	~U_Ptr()  
	{  
		delete ip;  
		cout << "U_ptr distructor called !" << endl;  
	}  
};  

class HasPtr  
{  
public:  
	// 构造函数:p是指向已经动态创建的int对象指针  
	HasPtr(int *p, int i) : ptr(new U_Ptr(p)) , val(i)  
	{  
		cout << "HasPtr constructor called ! " << "use = " << ptr->use << endl;  
	}  

	// 复制构造函数:复制成员并将使用计数加1  
	HasPtr(const HasPtr& orig) : ptr(orig.ptr) , val(orig.val)  
	{  
		++ptr->use;  
		cout << "HasPtr copy constructor called ! " << "use = " << ptr->use << endl;  
	}  

	// 赋值操作符  
	HasPtr& operator=(const HasPtr&);  

	// 析构函数:如果计数为0,则删除U_Ptr对象  
	~HasPtr()  
	{  
		cout << "HasPtr distructor called ! " << "use = " << ptr->use << endl;  
		if (--ptr->use == 0)  
			delete ptr;  
	}  

	// 获取数据成员  
	int *get_ptr() const  
	{  
		return ptr->ip;  
	}  
	int get_int() const  
	{  
		return val;  
	}  

	// 修改数据成员  
	void set_ptr(int *p) const  
	{  
		ptr->ip = p;  
	}  
	void set_int(int i)  
	{  
		val = i;  
	}  

	// 返回或修改基础int对象  
	int get_ptr_val() const  
	{  
		return *ptr->ip;  
	}  
	void set_ptr_val(int i)  
	{  
		*ptr->ip = i;  
	}  
private:  
	U_Ptr *ptr;   //指向使用计数类U_Ptr  
	int val;  
};  
HasPtr& HasPtr::operator = (const HasPtr &rhs)  //注意,这里赋值操作符在减少做操作数的使用计数之前使rhs的使用技术加1,从而防止自我赋值  
{  
	// 增加右操作数中的使用计数  
	++rhs.ptr->use;  
	// 将左操作数对象的使用计数减1,若该对象的使用计数减至0,则删除该对象  
	if (--ptr->use == 0)  
		delete ptr;  
	ptr = rhs.ptr;   // 复制U_Ptr指针  
	val = rhs.val;   // 复制int成员  
	return *this;  
}  

int main(void)  
{  
	int *pi = new int(42);  
	HasPtr *hpa = new HasPtr(pi, 100);    // 构造函数  
	HasPtr *hpb = new HasPtr(*hpa);     // 拷贝构造函数  
	HasPtr *hpc = new HasPtr(*hpa);     // 拷贝构造函数  
	HasPtr hpd = *hpa;     // 拷贝构造函数  

	cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl;  
	hpc->set_ptr_val(10000);  
	cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl;  
	hpd.set_ptr_val(10);  
	cout << hpa->get_ptr_val() << " " << hpb->get_ptr_val() << endl;  
	delete hpa;  
	delete hpb;  
	delete hpc;  
	cout << hpd.get_ptr_val() << endl;  
	return 0;  
} 

引用计数

生命控制客户不应直接控制组件的生命期原因:当使用完一个接口而仍然使用另一个接口时,是不能将组件释放掉的。由于很难知道两个接口指针是否指向同一组件,因此决定何时可以安全的释放一个组件将是极为复杂的。得知...
  • sinkou
  • sinkou
  • 2007年06月02日 12:48
  • 3540

Cocos2dx中的引用计数和自动回收池

本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=126 一、引用数 引用计数是c/c++工程中一种古老的内存管理方式。Ios SDK在NSAuto...
  • qinning199
  • qinning199
  • 2013年10月19日 00:44
  • 4696

cocos2d-x中的引用计数原理

本文基于3.2版本,适用于3.0及其以上版本,2.X版本可能是使用不同的方式进行处理,本文未对比2.X版本的源代码。首先看一下cocos2d-x中对象的继承体系:                  ...
  • realxie
  • realxie
  • 2016年04月03日 22:30
  • 1639

【C++】智能指针之引用计数的实现

本文将简单的介绍,C++11中的智能指针的引用计数大致是如何实现的。部分内容节选自 C++ primer 5th。...
  • zone_programming
  • zone_programming
  • 2015年09月11日 15:16
  • 2990

c++11-智能指针和引用计数

一、本节内容 本节内容包括: 对标准库的扩充: 智能指针和引用计数 RAII 与引用计数std::shared_ptrstd::unique_ptrstd::weak_ptr ...
  • icandoit2010
  • icandoit2010
  • 2017年02月23日 10:20
  • 380

如何实现一个引用计数?

要保证线程安全、要保证高效。 这是一个跟芯片架构、编译器都相关的工作。 剖析boost::detail::shared_ptr的计数实现机制: // shared_ptr中的引用计数成员属性pn bo...
  • lonelyrains
  • lonelyrains
  • 2016年04月12日 16:29
  • 3438

Cocos2d-x 3.x引用计数

引用计数:每一个对象都维护了一个 对象所有引用的计数值(表示有多少这个对象的引用,在堆内存中,只有一份该对象资源,但是由堆是共享的,那么该对象资源可以在其他函数内通过对象指针引用)。当一个新的引用指向...
  • hihozoo
  • hihozoo
  • 2016年02月27日 22:10
  • 370

ARC 下引用计数的打印

在管理内存的时候经常需要打印对象的引用计数,来检测对象是否发生内存泄漏的情况...
  • yishabeier152
  • yishabeier152
  • 2016年09月03日 11:21
  • 654

理解 boost::shared_ptr 中的引用计数是如何工作的

引用计数原理 指向相同资源的所有 shared_ptr 共享“引用计数管理区域”,并采用原子操作保证该区域中的引用计数值被互斥地访问。“引用计数管理区域”是指通过 new 创建的 sp_counte...
  • wohenfanjian
  • wohenfanjian
  • 2016年07月13日 17:12
  • 1695

关于 NSString 的引用计数问题

在 OC 语法的 MRC 手动引用计数的模式下,需要我们手动进行内存管理,即需要我们 在适当的地方添加 retain 和 release 方法   但是 NSString 是个例外,我们可以通过多种方...
  • aa603020460
  • aa603020460
  • 2015年11月14日 01:05
  • 796
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:引用计数
举报原因:
原因补充:

(最多只允许输入30个字)