为什么我的类析构函数立即被调用?

时间:2014-05-15 17:17:57

标签: c++ mfc

我有一个非常简单的类,它在线程中的函数完成时通知父线程。问题是在实例化它时,调用构造函数然后立即调用析构函数。这是班级:

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是挥发性的,但仍然没用。任何人为什么要立即调用析构函数?

2 个答案:

答案 0 :(得分:6)

直接调用析构函数,因为这行

AutoNotify( dlg->m_hWnd );

创建一个立即被删除的临时对象。

此行创建一个非临时对象:

AutoNotify guard( dlg->m_hWnd );

现在只有在guard对象超出范围时才会调用析构函数。

答案 1 :(得分:5)

AutoNotify(dlg->m_hWnd);

这是对你的构造函数的调用。它会创建一个立即销毁的临时对象。你通常会写:

AutoNotify a(dlg->m_hWnd);

现在它是一个命名对象,并将一直存在直到函数结束。