读书人

ACE Reactor中建立连接时内存泄露有关

发布时间: 2012-03-27 13:44:24 作者: rapoo

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.
以上泄露都是在程序退出时发现的,下面是我简化了的测试程序,不知道是我在程序退出时少调用了某些函数还是什么其他的原因,希望大侠们能够指点一下小弟,小弟跪谢。

C/C++ code
// 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;}


------解决方案--------------------


是啊,我也遇到这个问题,真郁闷

读书人网 >C++

热点推荐