2014-05-15 63 views
1

我有一個非常簡單的類,它在線程中的函數完成時通知父線程。問題是實例化它時,調用構造函數,然後立即調用析構函數。這裏是這個類:爲什麼我的類析構函數立即調用?

AutoNotify::AutoNotify(HWND hWnd) 
{ 
    m_hWnd = hWnd; 

    ::PostMessage(m_hWnd, IDM_THREAD_STARTED, 0 , 0); 
} 

AutoNotify::~AutoNotify(void) 
{ 
    ::PostMessage(m_hWnd, IDM_THREAD_FINISHED, 0 , 0); 
} 

這是我如何在另一個類中使用這個類。

UINT CTestDlg::ThreadProc(LPVOID lpVoid) 
{ 
    int result = false; 

    CTestDlg *dlg = (CTestDlg *) lpVoid; 

    AutoNotify(dlg->m_hWnd); 

    if ((result = dlg->LongFunction()) == ERROR_SUCCESS) 
     return result; 

    // more stuff 

    return TRUE; 
} 

當我通過調試步驟,它調用AutoNotify構造函數,然後立即它的析構函數。我想可能是因爲一些編譯器的優化,因爲這個類是空的!?比我聲明其唯一的成員變量m_hWnd是不穩定的,但仍然沒有用。任何人爲什麼立即調用析構函數?

+1

如果您沒有命名'AutoNotify'對象(或將其綁定到'const&'),它不會在它後面的';'存活。 – dlf

+0

沒有'AutoNotify'的實例。換句話說,本地版本會持續到「調用」構造函數的行上達到分號。 –

+2

'AutoNotify variable_name(dlg-> m_hWnd);'? – nevermind

回答

6

調用析構函數就因爲這條線

AutoNotify(dlg->m_hWnd); 

創建一個被立即刪除的臨時對象。

這行創建了一個非臨時對象:

AutoNotify guard(dlg->m_hWnd); 

現在的析構函數將只在guard對象超出範圍調用。

5
AutoNotify(dlg->m_hWnd); 

這是對您的構造函數的調用。它創建一個立即銷燬的臨時對象。你通常會寫:

AutoNotify a(dlg->m_hWnd); 

現在,它是一個命名對象,並將一直存在,直到函數結束。

相關問題