ACE反应器(Reactor)2

本文深入探讨了ACE中反应器(Reactor)用于事件多路分离和分派的体系结构模式,重点阐述了如何通过析构器、隐式拆除和引用计数等技术管理事件处理器的生命周期,确保内存资源的有效管理和避免潜在的内存泄漏问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       看到ACE中反应器(Reactor) 用于事件多路分离和分派的体系结构模式  一章中说:在从反应器注销,以及handle_close()挂钩方法被调用时,该类将自己删除。但是,必须保证MyEventHandler总是动态分配的(即是从ACE_Event_Handler派生出的类一定是new出来的,而不是stack上临时变量或全局变量。),否则,全局内存堆可能会崩溃。确保类总是动态地创建的一种办法是将析构器移动到类的私有区域去。有些不懂,网上查了下,还牵连到一些东西,额,自己C++实在太差。

       隐式拆除是更为常用的从反应器中拆除事件处理器的技术。事件处理器的每个"handle_"方法都会返回一个整数给反应器。如果此整数为0,在处理方法完成后,事件处理器将保持在反应器上的登记。但是,如果"handle_"方法返回的整数小于0,反应器将自动回调此事件处理器的handle_close()方法,并将它从自己的内部分派表中拆除。handle_close()方法用于执行处理器特有的任何清理工作,它们需要在事件处理器被拆除前完成;其中可以包括像删除处理器申请的动态内存,或关闭日志文件这样的工作。引用计数:在引用计数中,每一个对象负责维护对象所有引用的计数值。当一个新的引用指向对象时,引用计数器就递增,当去掉一个引用时,引用计数就递减。当引用计数到零时,该对象就将释放占有的资源。

       C++是一个静态绑定语言,在编译过程中,所有的非虚函数调用都必须分析完成(即使是虚函数也需检查可访问性)。因此,当在栈上生成对象时,对象会自动析构,也就是说析构函数必须可以访问。而堆上生成的对象析构时机由程序员控制,所以不一定需要析构函数。new出来的对象总需要delete掉,但是delete会调用析构函数,所以会产生类似于下方编译错误,如何释放呢,只需提供一个成员函数,此成员函数完成delete this操作即可。同样,此对象的临时变量定义同样会出现下面编译错误。如下面:

class QClientAcceptor: public ACE_Task<ACE_MT_SYNCH>
{
public:
	QClientAcceptor(void);

	virtual int open(void *args=0);
	int shutdown();
	int AddToSendQ(const char*szData,int nLen);
private:
	virtual ~QClientAcceptor(void);

	virtual int handle_input(ACE_HANDLE handle);
	virtual int handle_close(ACE_HANDLE , ACE_Reactor_Mask);
	virtual ACE_HANDLE get_handle(void) const;
	virtual int svc(void);
	ACE_SOCK_Acceptor	m_acceptor;	
};
///“QClientAcceptor::~QClientAcceptor”: 无法访问 private 成员(在“QClientAcceptor”类中声明)

参考:http://blog.youkuaiyun.com/yuwenbai/article/details/5443773

静态绑定参考:http://blog.youkuaiyun.com/chgaowei/article/details/6427731



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值