ACE_Asynch_Acceptor 内存泄露
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的步调缓慢增长。 贴上代码才知道问题所在。
我认为问题可能不在这里,可能在于你管理的链接对象处理器出了问题,没有正确清除导致。 每次成功接受一个连接请求后,ace会new一个MyClass对象进行服务。当断开连接后,ace好像没有回收该对象。 ACE不会回收,你要自己写代码删除连接管理器对象才行。 我在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; 哈哈,和我猜测的一样。
必须要删除:delete this;
出问题是因为你的代码写的有错误。
1、写出错不要调用delete,否则会和读出错重复操作,导致崩溃。
2、delete this的时候,必须保证其它代码、线程没有存取该对象,否则必然崩溃,crash.可以用引用计数解决。
[ 本帖最后由 winston 于 2008-12-19 21:14 编辑 ] 调用delete this后,程序自动退出了。 调用delete this的时候,会出现异常,相当于监听器也关闭了,监听器再也不相应新的连接请求了。 // 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,读写都关闭了,不会有其他的对象进行存取了
但是还是会出现:即使有新的连接到来,监听器没有任何响应 反复研究版主下面的话,让我很受启发,最终问题解决了,非常感谢
出问题是因为你的代码写的有错误。
1、写出错不要调用delete,否则会和读出错重复操作,导致崩溃。
2、delete this的时候,必须保证其它代码、线程没有存取该对象,否则必然崩溃,crash.可以用引用技术解决。
页:
[1]