我有一个非常简单的类,当线程中的函数完成时会通知父线程。问题是实例化它时,将调用构造函数,然后立即调用析构函数。这是课程:
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
为volatile,但仍然没有用。有人为什么立即调用析构函数?
立刻调用析构函数,因为此行
AutoNotify( dlg->m_hWnd );
创建一个临时对象,该对象会立即删除。
这行创建一个非临时对象:
AutoNotify guard( dlg->m_hWnd );
现在,仅当guard
对象超出范围时,才会调用析构函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句