求助;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;
}
找个工具看一下吧,
页:
[1]