如何優雅的寫UI——(6)內存泄漏

控件講了這麼久,其實個人程序有兩個Bug不知道你們有沒有發現,這兩個Bug都不會報錯,對程序運行來講都沒有阻礙,可是這種Bug對整個代碼來講是一個很大的安全隱患。設計模式

什麼是內存泄漏安全

內存泄漏(Memory Leak)是指程序中己動態分配的堆內存因爲某種緣由程序未釋放或沒法釋放,形成系統內存的浪費,致使程序運行速度減慢甚至系統崩潰等嚴重後果。函數

簡單的說就是new完以後沒有delete。固然,內存泄漏還不止這一點點。可是對於新手來講,大部分的內存泄漏都是由於new的緣由 照成的。spa

內存泄漏對程序的影響?

內存泄漏是形成應用程序OOM的主要緣由之一。咱們知道Android系統爲每一個應用程序分配的內存是有限的,而當一個應用中產生的內存泄漏比較多時,這就不免會致使應用所須要的內存超過系統分配的內存限額,這就形成了內存溢出從而致使應用Crash。設計

 

首先來看看消息溢出的報錯,分爲兩種,先來3d

首先來看看前六個內存泄露,其實他們就是屬於最多見的內存泄漏,我在new完窗口後沒有將窗口釋放掉調試

那麼這類問題很好解決,首先三個是成員函數,因此咱們只要在析構中delete這三個對象就能夠了。code

CtabView::~CtabView()
{
    if(m_dlg1)
    {
        delete m_dlg1;
        m_dlg1 = NULL;
    }

    if(m_dlg2)
    {
        delete m_dlg2;
        m_dlg2 = NULL;
    }

    if(m_dlg3)
    {
        delete m_dlg3;
        m_dlg3 = NULL;
    }
}

 

 

 

下面這個內存泄漏比較麻煩,無法一眼看出來緣由,因此咱們一點一點來分析對象

檢查定位泄漏的內存塊blog

 首先教你們如何定位泄漏的內存塊。在咱們以爲有內存泄露的地方添加函數,參數是內存塊,根據上面的圖顯示內存塊爲373;

_CrtSetBreakAlloc(373)

 

若是_CrtSetBreakAlloc函數檢測到內存泄露,例如我放在建立選項卡上方。他會中斷報錯,並跳進這裏,這就說明程序在這裏仍是有問題的,我們得繼續往下找

 

若是說,我把函數放在OnCreat下面,那麼這個程序調試就沒有問題

經過這樣檢測內存塊,咱們能夠判斷出是OnCreat這裏發生了內存泄露,可是OnCreat是微軟的API函數,我也沒有動態調用,爲什麼會出現內存溢出呢?

再仔細看一下報錯信息

Detected memory leaks!
Dumping objects ->
{373} client block at 0x05903290, subtype c0, 212 bytes long.
a CMFCVisualManager object at $05903290, 212 bytes long
Object dump complete.

他提到了CMFCVisualManager 這個類,那麼有可能這個泄露是跟這個類有關,上網上搜了一下,原理是緣由在於VS2008中MFC程序中的應用程序類都派生自CWinAppEx,VS 2008的程序裏有一個CMFCVisualManager類的全局對象,負責管理可視化界面,具體來講就是一個單件(設計模式中的單件模式),CWinAppEx類的ExitInstance函數能夠析構這個對象。可是以往的MFC程序的應用程序類都派生自CWinApp,由於須要在ExitInstance函數手動這個類對象,具體就是在應用程序類的ExitInstance函數添加代碼。

簡單的來講CWinAppEx::ExitInstance()函數自動對工程中所採用的CMFCVisualManager對象(如CMFCPropertyGridCtrl、CVCVSListBox等控件)釋放資源,而CWinApp::ExitInstance()沒有這個能力,所以須要重寫。因此這個泄露大體有兩種解決方案。

1.CWinApp::ExitInstance()沒有釋放能力,因此因此咱們須要手動釋放

在ExitInstance()添加代碼

CMFCVisualManager::DestroyInstance( TRUE );

2.ExitInstance()的自動釋放能力是基於CWinAppEx類的,因此咱們只須要將CxxxApp的父類改成CWinAppEx就能夠,同時CWinAppEx是自動實現ExitInstance()方法的,因此將代碼自動生成的ExitInstance()方法註釋掉就好。

 

 退出後沒有任何一處

 

 

另外我還發現項目自己還帶一些小Bug,好比點到第三頁直接跳出來關閉菜單,第二頁和第三頁顏色不知道爲何會變得同樣,這個須要慢慢解決

相關文章
相關標籤/搜索