MFC中使用ACE程序已知的“内存泄漏”

本文探讨了在MFC应用程序中使用ACE库时遇到的内存泄漏问题。在仅调用ACE的初始化和结束函数,以及在结合使用TAO和OpenDDS时,编译器都给出了内存泄漏的提示。尽管在结束DDS参与者工厂时进行了正常回收,但内存dump信息仍然显示出内存泄漏的存在。文章深入分析了可能的原因并提出了相应的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. MFC程序,链接ace.lib (不是acemfc.lib),仅调用初始化 ACE::init()和结束ACE::fini(),编译器如下提示

{167} normal block at 0x0181B9C0, 6 bytes long.
 Data: <      > 00 00 00 00 00 00 
{166} normal block at 0x0181B968, 28 bytes long.
 Data: 
 
   68 B9 81 01 1C A9 23 10 00 00 00 00 00 00 00 00 
Object dump complete.
 

 

2. MFC程序,链接TAO,OpenDDS,同样只作初始化和结束操作,编译器显示如下提示

 Data: 
 
   49 6D 52 5F 43 6C 69 65 6E 74 5F 41 64 61 70 74 
{451} normal block at 0x0181C790, 20 bytes 
  long.
 Data: 
  
    4F 52 54 5F 41 64 61 70 74 65 72 5F 46 61 63 74 
{450} normal block at 0x01821FA0, 40 bytes 
   long.
 Data: <  #             > 1C A9 23 10 13 00 00 00 14 00 00 00 90 C7 81 01 
{180} normal block at 0x0181BE38, 8 bytes 
   long.
 Data: 
   
     55 4E 4B 4E 4F 57 4E 00 
{179} normal block at 0x0181BDD8, 30 bytes 
    long.
 Data: 
    
      49 44 4C 3A 6F 6D 67 2E 6F 72 67 2F 43 4F 52 42 
{167} normal block at 0x0181B9C0, 6 bytes 
     long.
 Data: <      > 00 00 00 00 00 00 
{166} normal block at 0x0181B968, 28 bytes 
     long.
 Data: 
     
       68 B9 81 01 1C A9 23 10 00 00 00 00 00 00 00 00 
Object dump complete.
     
    
   
  
 

 

 

3. MFC程序,初始化DDS参与考工厂,结束时正常回收,代码如下

int MyPublsher::init(int& argc, char *argv[])
{
    dpf_ = TheParticipantFactoryWithArgs (argc, argv);
    if (CORBA::is_nil (dpf_.in ()) )
    {
        ACE_ERROR((LM_ERROR,
            ACE_TEXT("ERROR - Create participant factory failed./n") ));
        return -1;
    }

    // Create participant
    dp_ = dpf_->create_participant (411,
        PARTICIPANT_QOS_DEFAULT,
        DDS::DomainParticipantListener::_nil ());
    if (CORBA::is_nil (dp_.in ()) )
    {
        ACE_ERROR((LM_ERROR,
            ACE_TEXT("ERROR - Create participant failed./n") ));
        return -1;
    }

    return 0;
}
int MyPublisher::fini()
{
    // Clean up the transport
    // Clean up all the entities in the participant
    dp_->delete_contained_entities ();

    // Clean up the participant
    dpf_->delete_participant (dp_.in ());

    TheTransportFactory->release ();

    // Clean up DDS
    TheServiceParticipant->shutdown ();
    return 0;
}

 

内存dump信息如下:

{2253} normal block at 0x0182DBB0, 44 bytes long.
 Data: <    @           > 00 00 00 00 40 09 1C 00 FF FF FF FF 00 00 00 00 
{2252} normal block at 0x01867F78, 28 bytes long.
 Data: 

50 9C 15 00 FF FF FF FF 00 00 00 00 00 00 00 00 {2190} normal block at 0x01874798, 60 bytes long. Data: < > 00 00 00 00 00 00 00 00 A0 E8 83 01 00 00 00 00 {2164} normal block at 0x01873010, 15 bytes long. Data: < RST ;EI > 14 01 0F 00 52 53 54 02 3B 45 49 AB 87 04 00 {2163} normal block at 0x01872FC8, 8 bytes long. Data: < > 00 00 00 00 01 00 00 00 {2162} normal block at 0x01872F70, 24 bytes long. Data: < - / > 90 2D 81 00 08 00 00 00 08 00 00 00 C8 2F 87 01 {2160} normal block at 0x01872EE0, 8 bytes long. Data: < > 00 00 00 00 01 00 00 00 {2159} normal block at 0x01872E98, 8 bytes long. Data: < . > 98 2E 87 01 20 8A 86 01 {2158} normal block at 0x01872E50, 8 bytes long. Data: 52 6F 6F 74 50 4F 41 00 {2143} normal block at 0x01869160, 32768 bytes long. Data: < # # > 1C A9 23 10 00 00 00 00 00 00 00 00 16 A3 23 10 {2142} normal block at 0x018690C8, 88 bytes long. Data: < > B4 BF 81 00 00 00 00 00 00 00 00 00 0C BF 81 00 {2141} normal block at 0x01869030, 88 bytes long. Data: < > A4 E5 81 00 00 00 00 00 00 00 00 00 FC E4 81 00 {2140} normal block at 0x01868F98, 88 bytes long. Data: < c b > 84 63 81 00 00 00 00 00 00 00 00 00 DC 62 81 00 {2139} normal block at 0x01868F00, 88 bytes long. Data: 4C 4F 81 00 01 00 00 00 00 00 00 00 A4 4E 81 00 {2138} normal block at 0x01868E68, 88 bytes long. Data: < X /W > 04 58 81 00 00 00 00 00 00 00 00 00 5C 57 81 00 {2137} normal block at 0x01868DD0, 88 bytes long. Data: < m l > 8C 6D 81 00 00 00 00 00 00 00 00 00 E4 6C 81 00 {2136} normal block at 0x01868D38, 88 bytes long. Data: < > 9C F4 81 00 00 00 00 00 00 00 00 00 F4 F3 81 00 {2135} normal block at 0x01868CD8, 32 bytes long. Data: < t > F8 8C 86 01 74 8D 86 01 0C 8E 86 01 A4 8E 86 01 {2134} normal block at 0x018687C0, 8 bytes long. Data: 52 6F 6F 74 50 4F 41 00 {2133} normal block at 0x01868A20, 632 bytes long. Data: < # > 98 DB 81 00 EC DB 81 00 1C A9 23 10 07 00 00 00 {2122} normal block at 0x018684B0, 16 bytes long. Data: < " > F4 22 00 00 AC 80 86 01 A0 DC 84 01 A0 DC 84 01 {2121} normal block at 0x018683A0, 4 bytes long. Data: < j > A4 B9 6A 00 {2120} normal block at 0x01868330, 48 bytes long. Data:

> 70 B8 6A 00 F4 22 00 00 A8 81 85 01 01 CD CD CD {2119} normal block at 0x018682E8, 12 bytes long. Data: <` j > 60 B8 6A 00 00 00 00 00 D8 99 83 01 {2118} normal block at 0x01868188, 16 bytes long. Data:

50 B8 6A 00 00 00 00 00 A8 EB 83 01 D8 99 83 01 {2117} normal block at 0x018682A0, 9 bytes long. Data: <10.0.0.8 > 31 30 2E 30 2E 30 2E 38 00 {2116} normal block at 0x01868260, 4 bytes long. Data: < > A0 82 86 01 {2115} normal block at 0x01868200, 32 bytes long. Data: < ( j > 01 00 00 00 28 B8 6A 00 02 00 00 00 10 00 00 00 {2113} normal block at 0x01868058, 240 bytes long. Data: < j > D8 B4 6A 00 CD CD CD CD 00 00 00 00 CD CD CD CD {2112} normal block at 0x01868018, 4 bytes long. Data: 58 80 86 01 {2111} normal block at 0x01867FD0, 8 bytes long. Data: < > 18 80 86 01 01 00 00 00 {2108} normal block at 0x01867D98, 8 bytes long. Data: < } > 98 7D 86 01 00 84 86

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值