http://blog.sina.com.cn/s/blog_458f3c010100n4st.html

本文探讨了使用VS2005创建控制台程序并调用AfxSocketInit()时出现的内存泄漏问题。该问题仅在使用静态MFC库链接时发生,涉及sockcore.cpp中的特定代码片段。文中详细分析了问题根源,并提供了一种解决方案。

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

从来不写技术文章,因为没办法描述清楚观点。我一直认为,无法向别人解释清楚为什么的原因,一定在于自己还不是彻底地理解。拿出来说,不异于害人害已。这两天弄一个mfc的小程序,出了点问题,google了下,也只有提问的没找到回答。
    其实对于mfc,在其快老掉牙时,因为日常不怎么用,也始终是一知半解。就当下山来害回人吧。
 
   现象:vs2005新建一个console的程序,并调用AfxSocketInit(),会有memory leak. leak 的出处是sockcore.cpp中的
          #ifndef_AFXDLL
                      pThreadState->m_pmapSocketHandle =new CMapPtrToPtr;
                      pThreadState->m_pmapDeadSockets =new CMapPtrToPtr;
                       pThreadState->m_plistSocketNotifications= new CPtrList;
           #endif
    很明显这个问题只会在使用静态mfc库链接时才会发生。事实上这三块空间会在afxstate.cpp中的~AFX_MODULE_THREAD_STATE()中被删除,只是这个析构也没被调用。
     本来这个析构应该是被appmodul.cpp中的_AfxTermAppState()函数调用,这个函数也是只有在静态链接mfc库时才会被调用,因为它只有在
          #fndef _AFXDLL
                       char _afxInitAppState = (char)(AfxInitialize(FALSE, _MFC_VER),atexit(&_AfxTermAppState));
          #else
                       char _afxInitAppState = (char)(AfxInitialize(FALSE,_MFC_VER));
           #endif
时才会在程序结束时调用。
      出问题的就在_afxInitAppState,在console程序中它不会被调用,而在windows程序中才会被调用。应该在项目属性中哪里可以设置。_afxInitAppState应该是这个函数列表里的一项__xc_a ~__xc_z,他们是在进入_tmain()之前被调用的初始化函数表,但在mfc的source里无法找到它们的定义,是被extern进来的。
    好,下面就是出问题的顺序,因为初始化列表__xc_a~__xc_z中没有_afxInitAppState,使得程序离开时_AfxTermAppState无法被调用,也就使AFX_MODULE_THREAD_STATE没被析构,所以三块内存没被析构。可能是微软认国在console程序下_afxInitAppState是不需要被调用的。
 
      目前解决的方案是在序退出前加上
          #fndef _AFXDLL
                          AfxTermLocalData(NULL, TRUE);
          #endif
是不是有其它问题不得而知,因为,对mfc的一知半解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值