law5211314 发表于 2011-7-8 11:44:59

求助;ACE Reactor中建立连接时内存泄露问题

本人ACE新手,最近在开发项目时遇到了问题。(vs2008)
当使用ACE的反应器中连接器建立连接时,如果使用同步阻塞方式连接,程序退出时不会有内存泄露。
如果设置超时时间,建立连接时则会发现有一次性的44+28字节的内存泄露。如下所示。
{7987} normal block at 0x00DE6BD8, 44 bytes long.
Data: < ` > 00 00 00 00 60 0D 16 00 FF FF FF FF 00 00 00 00
{7986} normal block at 0x0039CBD8, 28 bytes long.
Data: < > E8 EF 15 00 FF FF FF FF 00 00 00 00 00 00 00 00
如果在连接时使用异步连接方式如下程序所示,就会产生一次性的内存泄露44+28字节,同上,和循环内存泄露40字节(每connect一次就泄露40字节),如下。
{7987} normal block at 0x00DE6BD8, 44 bytes long.
Data: < ` > 00 00 00 00 60 0D 16 00 FF FF FF FF 00 00 00 00
{7986} normal block at 0x0039CBD8, 28 bytes long.
Data: < > E8 EF 15 00 FF FF FF FF 00 00 00 00 00 00 00 00
{7899} normal block at 0x00DE6CA8, 40 bytes long.
Data: < T 9 > 04 54 06 10 01 00 00 00 00 00 00 00 E8 D6 39 00
{7801} normal block at 0x00DE6C40, 40 bytes long.
以上泄露都是在程序退出时发现的,下面是我简化了的测试程序,不知道是我在程序退出时少调用了某些函数还是什么其他的原因,希望大侠们能够指点一下小弟,小弟跪谢。// Client.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <ace\Svc_Handler.h>
#include <ace\SOCK_Stream.h>
#include <ace\Connector.h>
#include <ace\SOCK_Connector.h>
using namespace std;
#pragma comment(lib , "aced.lib")

class CTestSvc :
    public ACE_Svc_Handler<ACE_SOCK_Stream , ACE_MT_SYNCH>
{
public:
    CTestSvc(void){;}
    virtual ~CTestSvc(){;}   
    //连接关闭回调接口
    virtual int handle_close(ACE_HANDLE= ACE_INVALID_HANDLE ,
      ACE_Reactor_Mask= ACE_Event_Handler::ALL_EVENTS_MASK )
       {
          if(reactor())
      {
            reactor()->end_reactor_event_loop();
            reactor()->remove_handler(this , WRITE_MASK);
            reactor(0);
            cout<<"handle_close"<<endl;
      }
   
      return 0;
      }   
    virtual int handle_output(ACE_HANDLE fd /* = ACE_INVALID_HANDLE */)
    {
      cout<<"handle_output"<<endl;
      return 0;
    }
   
};


//////////////////////////////////////////////////////////////////////////
class CCmdConnector :
    public ACE_Connector<CTestSvc , ACE_SOCK_Connector>
{
public:
    typedef ACE_Connector<CTestSvc , ACE_SOCK_Connector> parentclass;
    CCmdConnector(void){;}
    virtual ~CCmdConnector(void){;}
    //创建服务句柄
    virtual int make_svc_handler(CTestSvc *& sn)
    {
      return parentclass::make_svc_handler(sn);
    }
};

//////////////////////////////////////////////////////////////////////////
class CClient :
    public ACE_Task<ACE_MT_SYNCH>
{
public:
    CCmdConnector m_Connector;
    CTestSvc * m_pTestsvc;
public:
    CClient()
    {
      m_pTestsvc = new CTestSvc;
    }
    ~CClient()
    {
      if(m_pTestsvc)
      {
            delete m_pTestsvc;
            m_pTestsvc = NULL;
      }
      reactor(0);
    }
    //启动
    void Start()
    {
      int nRet = 0;
      nRet = m_Connector.open();
      if(nRet == -1)
      {
            cout<<"启动失败"<<endl;
            return;
      }

      ACE_INET_Addr addr("192.168.5.112:27015");
      nRet = m_Connector.connect(m_pTestsvc , addr , ACE_Synch_Options::asynch);   
      this->activate();
    }

    void End()
    {
      m_Connector.cancel(m_pTestsvc);
      m_Connector.close();
      m_pTestsvc->handle_close();
      wait();
    }

};

//////////////////////////////////////////////////////////////////

int _tmain(int argc, _TCHAR* argv[])
{
    CClient client;

   client.Start();
   Sleep(5000);
   client.End();

    return 0;
}

yoogera 发表于 2011-7-8 20:32:26

找个工具看一下吧,
页: [1]
查看完整版本: 求助;ACE Reactor中建立连接时内存泄露问题