贝贝花花包包店,精品555皮具,钱夹,皮夹

字体:  

Release 版本下 proactor 发生异常

peakzhang 发表于: 2008-7-15 22:57 来源: ACE 开发者

如题,我在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);
}
各位,有碰到过问题吗,怎么解决的,我在网上搜不到!

最新回复

peakzhang at 2008-7-15 22:57:56
我碰到过的。
是你退出的时候,处理顺序不对,主线程退出了,但是其它线程还在跑,导致结果返回的时候,造成错误。
还有一种情况,就是内存错误 - debug下,因为有保护字节,所以不表现出来,release下很容易出现。再者,看看是否有未保护的全局变量。
peakzhang at 2008-7-15 22:58:03
武断一点说,凡事ace内部报错的,几乎都是用户自己写的代码有问题导致的.

我不小心多次犯过这样的错误,小列几个: 

1. 构造ACE_Message_Block的时候,错误的指定了大小

2.   wr_ptr(len)或rd_ptr(len)时,错误的计算了长度

3.  链接其它库的时候,错误的加载了版本

4.  实例化一个对象或结构的时候,没有调用正确的构造函数进行初始化

5.  重载或模版参数实例化时,错误的设置了基类或参数不清

常常,大问题都是小错误引起的,养成好的编码风格和编码心态才能尽量少犯错误.
peakzhang at 2008-7-15 22:58:09
我也知道肯定是自已的问题,因为在网上发现别人好像都没有遇到此问题!

但我对两种版本下都一一跟踪过,就是到动态转化时出错,找了一下午,还是没有找到原因,郁闷中。。。
peakzhang at 2008-7-15 22:58:22
问题终于得解:

因为在 ACE 库中使用了大量的 dynamic_cast,而此机制需要“运行时类型信息 RTTI”的支持,在 ACE 的工程配置中此选项是被选中的,但VC开发环境的默认配置是禁止此项的(打开此项会影响程序的效率)。有意思的是我的 DEBUG 版本不知什么时候选中了此项,但由于 RELEASE 是默认的设置,导致了此问题的产生。

希望大家注意:以后的程序只要用到 ACE 库时都要设置此选项!