我有一个非常简单的类,它在线程中的函数完成时通知父线程。问题是在实例化它时,调用构造函数然后立即调用析构函数。这是班级:
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
是挥发性的,但仍然没用。任何人为什么要立即调用析构函数?
答案 0 :(得分:6)
直接调用析构函数,因为这行
AutoNotify( dlg->m_hWnd );
创建一个立即被删除的临时对象。
此行创建一个非临时对象:
AutoNotify guard( dlg->m_hWnd );
现在只有在guard
对象超出范围时才会调用析构函数。
答案 1 :(得分:5)
AutoNotify(dlg->m_hWnd);
这是对你的构造函数的调用。它会创建一个立即销毁的临时对象。你通常会写:
AutoNotify a(dlg->m_hWnd);
现在它是一个命名对象,并将一直存在直到函数结束。