找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4344|回复: 9

ACE_Asynch_Acceptor 内存泄露

[复制链接]
发表于 2008-12-18 15:43:35 | 显示全部楼层 |阅读模式
ACE_Asynch_Acceptor 内存泄露

开发平台Windows,  vc2005
开发的一个服务器程序,运行几天后,虚拟内存由60M增长到200多M,并且还有缓慢增长的趋势。

后来经过不断测试,发现问题应该出现在ACE_Asynch_Acceptor监听器这个地方。
ACE_Asynch_Acceptor<MyClass>  listen;
if (0 != listen.open (p2p_listen_addr, 0, 0, 5, 1, 0, 1))
{
        ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("listen open failed.\n")), 1);
}

测试内存泄露症状:
当有一个连接时,反复断开连接,不会出现内存泄露。
若有多个连接,断开连接若干次后,会出现内存泄露,以4K的步调缓慢增长。
发表于 2008-12-18 16:34:09 | 显示全部楼层
贴上代码才知道问题所在。
我认为问题可能不在这里,可能在于你管理的链接对象处理器出了问题,没有正确清除导致。
 楼主| 发表于 2008-12-18 23:29:22 | 显示全部楼层
每次成功接受一个连接请求后,ace会new一个MyClass对象进行服务。当断开连接后,ace好像没有回收该对象。
发表于 2008-12-19 11:08:50 | 显示全部楼层
ACE不会回收,你要自己写代码删除连接管理器对象才行。
 楼主| 发表于 2008-12-19 16:20:04 | 显示全部楼层
我在open失败,以及读写失败会执行下面方法
  
// cancel all operations
reader_.cancel();
writer_.cancel();

// close the socket
ACE_OS::shutdown(this->handle(),SD_BOTH);
ACE_OS::closesocket(this->handle());
this->handle(ACE_INVALID_HANDLE);

//若再加上下面代码,会出现关闭所有连接,并且ACE_Asynch_Acceptor <MyClass>  listen;该监听器不会监听新
//的连接,不能相应新的连接请求。(我的目的:就是要在这个地方让ACE回收该对象,或者直接把它delete掉。但是直接
//delete this 会出现问题)
delete this;
发表于 2008-12-19 16:32:06 | 显示全部楼层
哈哈,和我猜测的一样。
必须要删除:delete this;
出问题是因为你的代码写的有错误。
1、写出错不要调用delete,否则会和读出错重复操作,导致崩溃。
2、delete this的时候,必须保证其它代码、线程没有存取该对象,否则必然崩溃,crash.可以用引用计数解决。

[ 本帖最后由 winston 于 2008-12-19 21:14 编辑 ]
 楼主| 发表于 2008-12-19 17:55:31 | 显示全部楼层
调用delete this后,程序自动退出了。
 楼主| 发表于 2008-12-19 18:11:34 | 显示全部楼层
调用delete this的时候,会出现异常,相当于监听器也关闭了,监听器再也不相应新的连接请求了。
 楼主| 发表于 2008-12-19 18:30:06 | 显示全部楼层
// cancel all operations
reader_.cancel();
writer_.cancel();

// close the socket
ACE_OS::shutdown(this->handle(),SD_BOTH);
ACE_OS::closesocket(this->handle());
this->handle(ACE_INVALID_HANDLE);

delete this;    //此时delete,读写都关闭了,不会有其他的对象进行存取了

但是还是会出现:即使有新的连接到来,监听器没有任何响应
 楼主| 发表于 2008-12-19 19:35:34 | 显示全部楼层
反复研究版主下面的话,让我很受启发,最终问题解决了,非常感谢
出问题是因为你的代码写的有错误。
1、写出错不要调用delete,否则会和读出错重复操作,导致崩溃。
2、delete this的时候,必须保证其它代码、线程没有存取该对象,否则必然崩溃,crash.可以用引用技术解决。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-23 21:34 , Processed in 0.023703 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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