boost库在工作(12)引用计数的智能指针intrusive_ptr

当我们在维护旧代码时,很多情况是身不由己的,想从头来开发,又需要时间过多,投入成本过多,老板当然不愿意。想继续使用旧的代码,又需要投入过多的维护成本。要想在这种情况下,提高代码的维护性,又减少出错,因而想引入智能指针管理。比如已经存在引用计数的对象时,如果再想使用智能指针shared_ptr来管理,显然达不目标了,那么怎么办呢?就这样放弃智能指针的使用吗?显然不行,有没有更好的方法呢?在boost库里,又提供了一个强大的智能指针intrusive_ptr来实现这样的功能。前面的智能指针shared_ptr是提供自己内部的引用计数,我们想修改它的引用计数方法是很困难的,也实现不了,而智能指针intrusive_ptr考虑到这种情况,很方便实现了。如下面的例子:
// boost_007.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
#include <boost/intrusive_ptr.hpp>

//接口引用计数
class IUnknown
{  
	int m_lCountRef;  
public:    
	IUnknown() 
		: m_lCountRef(0) 
	{}      

	virtual ~IUnknown() 
	{}

	unsigned long AddRef(void)
	{
		++m_lCountRef; 
		return m_lCountRef;
	}

	unsigned long Release(void)
	{
		if (--m_lCountRef==0)
		{
			delete this;     
		}

		return m_lCountRef;
	} 
protected:    
	IUnknown& operator=(const IUnknown&) 
	{    
		// 无操作      
		return *this;    
	}  
private:    
	// 禁止复制构造函数    
	IUnknown(const IUnknown&); 
};


class com_class : public IUnknown 
{
public:  
	com_class() 
	{    
		std::cout << "com_class::com_class()\n";  
	}  

	com_class(const com_class& other) 
	{    
		std::cout << "com_class(const com_class& other)\n";  
	}  

	~com_class() 
	{    
		std::cout << "com_class::~com_class()\n";  
	}

	//定义两个给intrusive_ptr调用函数
	friend void intrusive_ptr_add_ref(IUnknown* p) 
	{        
		p->AddRef();
	}   

	friend void intrusive_ptr_release(IUnknown* p) 
	{       
		p->Release();
	} 
};

int _tmain(int argc, _TCHAR* argv[])
{
	//测试使用。
	std::cout << "Before start of scope\n";  
	{    
		boost::intrusive_ptr<com_class> p1(new com_class());    
		boost::intrusive_ptr<com_class> p2(p1);  
	}  
	std::cout << "After end of scope \n";

	system("PAUSE");

	return 0;
}
在这个例子里,类 IUnknown 就是一个旧代码已经声明的引用计数,然后在派生类 com_class 里实现对引用计数进行增加或减少,就可以使用智能指针 intrusive_ptr 来管理了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值