//manage exit ==>delete process object
class chExitMethodList;
typedef void (*msgExitMethod)();
class ETLLIB_DLL_DECLARRE chExitMethodWrap
{
	friend class chExitMethodList;
public:
	void onExit();
public:
	chExitMethodWrap(chExitMethodList* pOwner, msgExitMethod method);
	~chExitMethodWrap();
private:
	msgExitMethod		m_pMethod;
	chExitMethodList*	m_pOwnerList;
};
class ETLLIB_DLL_DECLARRE chExitMethodList : public chObjList_stack< chExitMethodWrap* >
{
public:
	BOOL AddExitMethod(chExitMethodWrap* pWrap);
	void RemoveExitMethod(chExitMethodWrap* pWrap);
	void ExecuteOnExit();
};
//////////////////////////////////////////////////////////////////////////
// class chExitMethodWrap
chExitMethodWrap::chExitMethodWrap(chExitMethodList* pOwner, msgExitMethod method)
{
	m_pOwnerList = pOwner;
	m_pMethod = method;
	pOwner->AddExitMethod(this);
}
chExitMethodWrap::~chExitMethodWrap()
{
	if(m_pOwnerList != NULL)
	{
		m_pOwnerList->RemoveExitMethod(this);
		onExit();
	}
}
void chExitMethodWrap::onExit()
{
	m_pMethod();
	m_pMethod = NULL_METHOD;
	m_pOwnerList = NULL;
}
//////////////////////////////////////////////////////////////////////////
// class chExitMethodList
BOOL chExitMethodList::AddExitMethod(chExitMethodWrap* pWrap)
{
	chASSERT(pWrap != NULL_METHOD && !chExitMethodList::has_value(pWrap));
	chExitMethodList::push_front(pWrap);
	return true;
}
void chExitMethodList::RemoveExitMethod(chExitMethodWrap* pWrap)
{
	chExitMethodList::erase_value(pWrap);
}
void chExitMethodList::ExecuteOnExit()
{
	while(!empty())
	{
		chExitMethodWrap* pWrap = front();
		pop_front();
		pWrap->onExit();
	}
}
#define DECLARE_PROCESS_OBJECT(type) \
	public: static type& getInstance();\
	public: static bool hasInstance();\
	public: static void releaseInstance();
#define IMPLEMENT_PROCESS_OBJECT(type)		\
	static type* s_##type = NULL;\
	static bool b_##type##freed = false;\
	type& type::getInstance() { static bool bConstructing = false; chASSERT(!b_##type##freed && !bConstructing); if(s_##type == NULL && !b_##type##freed) { bConstructing = true; s_##type = new type(); bConstructing = false; static chExitMethodWrap wrap(&g_uCSystemMessage, type::releaseInstance); } return *s_##type; }\
	bool type::hasInstance() { return s_##type != NULL; }\
	void type::releaseInstance() { if(s_##type != NULL) { delete s_##type; s_##type = NULL; b_##type##freed = true;} }\
//note g_uCSystemMessage ==> public chExitMethodList
原文:http://www.cnblogs.com/hqu-ye/p/4535008.html