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

Why is my class destructor called in immediately?

本文关键字:调用 析构函数 我的 为什么      更新时间:2023-10-16

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

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构造函数,然后立即调用其析构函数。我想可能是因为编译器优化,因为类是空的!?Than我将其唯一的成员变量m_hWnd声明为volatile,但仍然没有使用。有人知道为什么要立即调用析构函数吗?

析构函数被立即调用,因为这行

AutoNotify( dlg->m_hWnd );

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

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

AutoNotify guard( dlg->m_hWnd );

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

AutoNotify(dlg->m_hWnd);

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

AutoNotify a(dlg->m_hWnd);

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