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;}