我有一个非常简单的类,它在线程中的函数完成时通知父线程。问题是在实例化它时,调用构造函数,然后立即调用析构函数。这是类(class):
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 );
}
这是我在另一个类(class)中使用这个类(class)的方式。
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
对象超出范围时才会调用析构函数。
关于c++ - 为什么我的类析构函数会立即被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23684812/