blaight 发表于 2009-3-28 20:08:02

ACE的初始化和关闭问题

问一下,我在DLL中使用了Singleton,它所管理的那个类SysController的析构函数还会用到ACE_TRACE以及消息队列来关闭另外一个线程。然后在一个以ACE_TMAIN为入口的Win32 Console Applicatoin中使用这个DLL,可是总在程序结束的时候,当执行到SysController的析构函数时,就在ACE_TRACE时出错了。

似乎这时候ACE_TRACE已经不能用了,为什么会这样呢?看调用堆栈,是在一个ACE_Main对象的析构函数中调用到SysController的析构函数。

之前用的main函数为入口的一个exe程序倒是没问题的啊,在那个调用中,我显式的调用个ACE::Init() 和ACE::Fini(),而在这个以ACE_TMAIN为入口的Win32 Console Applicatoin中不管是否显式地调用ACE::Init()和ACE::Fini()都会出现上面的问题。

很是头疼啊。

modern 发表于 2009-3-29 10:26:41

可能是生命周期不一致导致的问题,
可能因为exe的生命周期结束了的时候,
释放其申请的全局空间,但是dll的生命周期还在,
因此exe结束的时候,顺手帮DLL自动释放掉其内部单件的东西,
这显然会导致错误。

dll中使用单件模式,
书上建议说使用ACE_Unmanaged_Singleton,
由自己选择合适的时机,显示调用close函数主动释放,
实际中我也是这么用的,未见出什么问题。
页: [1]
查看完整版本: ACE的初始化和关闭问题