http://blog.sina.com.cn/s/blog_458f3c010100n4st.html
生活随笔
收集整理的這篇文章主要介紹了
http://blog.sina.com.cn/s/blog_458f3c010100n4st.html
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
從來不寫技術文章,因為沒辦法描述清楚觀點。我一直認為,無法向別人解釋清楚為什么的原因,一定在于自己還不是徹底地理解。拿出來說,不異于害人害已。這兩天弄一個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的一知半解
??????????????????????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的一知半解
總結
以上是生活随笔為你收集整理的http://blog.sina.com.cn/s/blog_458f3c010100n4st.html的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ECC-based 算法(ECDSA/E
- 下一篇: SocketAPI,CAsyncSock