ACE反应器(Reactor)2

看到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.csdn.net/yuwenbai/article/details/5443773

静态绑定参考:http://www.jb51.cc/article/p-qfxxuwkc-st.html

相关文章

react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接...
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc ...