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

好像是内存泄露,导致资源耗尽所致。
页: 1 [2] 3
查看完整版本: socket关不掉吗?