Release 版本下 proactor 发生异常
如题,我在DEBUG版本下用的好好的,但在RELEASE版本下,退出时就会发生异常,调试跟踪发现在这一行发生的:int
ACE_WIN32_Asynch_Result::post_completion (ACE_Proactor_Impl *proactor)
{
// Get to the platform specific implementation.
ACE_WIN32_Proactor *win32_proactor = dynamic_cast<ACE_WIN32_Proactor *> (proactor);
if (win32_proactor == 0)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("Dynamic cast to WIN32 Proactor failed\n")),
-1);
// Post myself.
return win32_proactor->post_completion (this);
}
各位,有碰到过问题吗,怎么解决的,我在网上搜不到! 我碰到过的。
是你退出的时候,处理顺序不对,主线程退出了,但是其它线程还在跑,导致结果返回的时候,造成错误。
还有一种情况,就是内存错误 - debug下,因为有保护字节,所以不表现出来,release下很容易出现。再者,看看是否有未保护的全局变量。 武断一点说,凡事ace内部报错的,几乎都是用户自己写的代码有问题导致的.
我不小心多次犯过这样的错误,小列几个:
1. 构造ACE_Message_Block的时候,错误的指定了大小
2. wr_ptr(len)或rd_ptr(len)时,错误的计算了长度
3. 链接其它库的时候,错误的加载了版本
4. 实例化一个对象或结构的时候,没有调用正确的构造函数进行初始化
5. 重载或模版参数实例化时,错误的设置了基类或参数不清
常常,大问题都是小错误引起的,养成好的编码风格和编码心态才能尽量少犯错误. 我也知道肯定是自已的问题,因为在网上发现别人好像都没有遇到此问题!
但我对两种版本下都一一跟踪过,就是到动态转化时出错,找了一下午,还是没有找到原因,郁闷中。。。 问题终于得解:
因为在 ACE 库中使用了大量的 dynamic_cast,而此机制需要“运行时类型信息 RTTI”的支持,在 ACE 的工程配置中此选项是被选中的,但VC开发环境的默认配置是禁止此项的(打开此项会影响程序的效率)。有意思的是我的 DEBUG 版本不知什么时候选中了此项,但由于 RELEASE 是默认的设置,导致了此问题的产生。
希望大家注意:以后的程序只要用到 ACE 库时都要设置此选项!
页:
[1]