找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4313|回复: 1

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

[复制链接]
发表于 2011-7-8 11:44:59 | 显示全部楼层 |阅读模式
本人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.
以上泄露都是在程序退出时发现的,下面是我简化了的测试程序,不知道是我在程序退出时少调用了某些函数还是什么其他的原因,希望大侠们能够指点一下小弟,小弟跪谢。
  1. // Client.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include <iostream>
  5. #include <ace\Svc_Handler.h>
  6. #include <ace\SOCK_Stream.h>
  7. #include <ace\Connector.h>
  8. #include <ace\SOCK_Connector.h>
  9. using namespace std;
  10. #pragma comment(lib , "aced.lib")
  11. class CTestSvc :
  12.     public ACE_Svc_Handler<ACE_SOCK_Stream , ACE_MT_SYNCH>
  13. {
  14. public:
  15.     CTestSvc(void){;}
  16.     virtual ~CTestSvc(){;}   
  17.     //连接关闭回调接口
  18.     virtual int handle_close(ACE_HANDLE  = ACE_INVALID_HANDLE ,
  19.         ACE_Reactor_Mask  = ACE_Event_Handler::ALL_EVENTS_MASK )
  20.        {
  21.           if(reactor())
  22.         {
  23.             reactor()->end_reactor_event_loop();
  24.             reactor()->remove_handler(this , WRITE_MASK);
  25.             reactor(0);
  26.             cout<<"handle_close"<<endl;
  27.         }
  28.    
  29.         return 0;
  30.         }   
  31.     virtual int handle_output(ACE_HANDLE fd /* = ACE_INVALID_HANDLE */)
  32.     {
  33.         cout<<"handle_output"<<endl;
  34.         return 0;
  35.     }
  36.    
  37. };
  38. //////////////////////////////////////////////////////////////////////////
  39. class CCmdConnector :
  40.     public ACE_Connector<CTestSvc , ACE_SOCK_Connector>
  41. {
  42. public:
  43.     typedef ACE_Connector<CTestSvc , ACE_SOCK_Connector> parentclass;
  44.     CCmdConnector(void){;}
  45.     virtual ~CCmdConnector(void){;}
  46.     //创建服务句柄
  47.     virtual int make_svc_handler(CTestSvc *& sn)
  48.     {
  49.         return parentclass::make_svc_handler(sn);
  50.     }
  51. };
  52. //////////////////////////////////////////////////////////////////////////
  53. class CClient :
  54.     public ACE_Task<ACE_MT_SYNCH>
  55. {
  56. public:
  57.     CCmdConnector m_Connector;
  58.     CTestSvc * m_pTestsvc;
  59. public:
  60.     CClient()
  61.     {
  62.         m_pTestsvc = new CTestSvc;
  63.     }
  64.     ~CClient()
  65.     {
  66.         if(m_pTestsvc)
  67.         {
  68.             delete m_pTestsvc;
  69.             m_pTestsvc = NULL;
  70.         }
  71.         reactor(0);
  72.     }
  73.     //启动
  74.     void Start()
  75.     {
  76.         int nRet = 0;
  77.         nRet = m_Connector.open();
  78.         if(nRet == -1)
  79.         {
  80.             cout<<"启动失败"<<endl;
  81.             return;
  82.         }
  83.         ACE_INET_Addr addr("192.168.5.112:27015");
  84.         nRet = m_Connector.connect(m_pTestsvc , addr , ACE_Synch_Options::asynch);   
  85.         this->activate();
  86.     }
  87.     void End()
  88.     {
  89.         m_Connector.cancel(m_pTestsvc);
  90.         m_Connector.close();
  91.         m_pTestsvc->handle_close();
  92.         wait();
  93.     }
  94. };
  95. //////////////////////////////////////////////////////////////////
  96. int _tmain(int argc, _TCHAR* argv[])
  97. {  
  98.     CClient client;
  99.      client.Start();
  100.      Sleep(5000);
  101.      client.End();
  102.     return 0;
  103. }
复制代码
发表于 2011-7-8 20:32:26 | 显示全部楼层
找个工具看一下吧,
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-5-6 10:58 , Processed in 0.018180 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表