peakzhang
发表于 2007-12-25 19:12:30
delete pTest的时候,可能是如下因素导致崩溃:
如果connect成功,则如下代码被调用,
void CTestB:pen (ACE_HANDLE h, ACE_Message_Block&)
{
if (!m_pTestA)
{
delete this;
return;
}
this->handle (h);
if (this->m_Reader.open (*this) != 0 || this->m_Writer.open (*this) != 0)
{
delete this;
return;
}
ACE_NEW_NORETURN (m_pReaderMB, ACE_Message_Block (PACKET_BUFFERSIZE));
if (m_pTestA)
m_pTestA->MethodB();
PostRead();
}
如果你直接删除,系统里面还有注册的异步调用,会调B对象,导致错误。
解决方案,让B对象自己退出,上面调用者要等待。
开发者
发表于 2007-12-26 09:52:03
你是说上面的delete this都要去掉?如何等待?
开发者
发表于 2007-12-26 10:44:49
b对象如何自己退出!?
开发者
发表于 2007-12-26 10:53:49
另外,我的程序总是在一些new或者delete 一个ACE_Message_Block指针的时候挂掉
winston
发表于 2007-12-26 13:25:36
b对象会自己删除自己,自动退出。但是外面的程序最好等待它,一起退出。
new的时候一般不会出错,delete的时候出错,一般都是被删除的对象还在被操作中导致。
自己仔细查一下你的调用和线程同步处理吧。
开发者
发表于 2007-12-27 14:34:10
谢谢啊!问题解决了,可是随之而来又出现了两个问题,不知道什么原因
一。在压力测试中,有几百个客户端每30秒就去重复的连接服务器,但是在服务器这边发现时间长了,内存就被用光了,可是我在程序中已经将客户端的请求都断开了,连接也关闭了,acceptor也delete了。
二。客户端连接服务器的时候,压力测试中,比如有1000多客户端要去连接服务器,如果服务器死掉了,过一会再将服务器重启,这时在客户端这边维护的一个ACE_Asynch_Connector<...>在connect的时候就有问题了,总也连接不上
知不知道什么原因!!!!!!
开发者
发表于 2007-12-27 15:22:52
这个是第二个问题的错误提示:
ACE_Asynch_Connect::connect:Invalid argument
winston
发表于 2007-12-27 15:51:33
查看内存状态,用LOG进行记录追踪。
开发者
发表于 2007-12-27 16:07:03
好像内存没涨多少,但是虚拟内存一直在涨,都到2G了
winston
发表于 2007-12-27 16:21:06
好像是内存泄露,导致资源耗尽所致。