找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3960|回复: 3

handle_close里加锁导致内存出错

[复制链接]
发表于 2007-12-20 22:04:33 | 显示全部楼层 |阅读模式
问题是这样的,我在使用\ACE_wrappers\examples\APG\Reactor下的例子HAStatus时在
  1. int
  2. ClientService::handle_close (ACE_HANDLE, ACE_Reactor_Mask mask)
  3. {
  4.   if (mask == ACE_Event_Handler::WRITE_MASK)
  5.     return 0;
  6.   lock_.acquire(); //增加这里
  7.   mask = ACE_Event_Handler::ALL_EVENTS_MASK |
  8.          ACE_Event_Handler::DONT_CALL;
  9.   this->reactor ()->remove_handler (this, mask);
  10.   this->sock_.close ();
  11.   this->output_queue_.flush ();
  12.   delete this;
  13.   lock_.release();//在增加这里
  14.   return 0;
  15. }
复制代码
本来是想改成TP_Reactor防止多次删除,但是奇怪的问题发生了
在Client第二次连接的时候发生错误

HEAP[HAStatus.exe]: HEAP: Free Heap block 96c110 modified at 96c190 after it was freed
Unhandled exception at 0x7c94a3e1 in HAStatus.exe: User breakpoint.

跟踪进去也没发现错误,继续运行结果仍然正常,请大家为我解疑

我测试的平台
Windows XP SP2
Vc++ 2003
ACE 5.6.0

thks
发表于 2007-12-21 00:05:11 | 显示全部楼层
delete this;
lock_.release();//在增加这里

改成
lock_.release();//在增加这里
delete this;
试试
 楼主| 发表于 2007-12-21 10:43:36 | 显示全部楼层
谢谢,问题找到了,但是没办法解决呀,ACE能保证handle_close只被调用一次吗,因为只要delete this后,handle_close只要能重入就一定会出错呀
发表于 2007-12-21 11:07:21 | 显示全部楼层
先仔细研究Reactor的机制,想想看。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 19:20 , Processed in 0.015399 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表