为什么我的类析构函数被立即调用
Why is my class destructor called in immediately?
我有一个非常简单的类,当线程中的函数完成时,它会通知父线程。问题是当实例化它时,调用构造函数,然后立即调用析构函数。这是类别:
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);
现在它是一个命名对象,并且将一直存在到函数结束。
相关文章:
- 什么时候调用析构函数
- C++-明确何时以及如何调用析构函数
- C++ 防止在映射中放置()时调用析构函数
- 调用析构函数以释放动态分配的内存
- C++:使用方法调用析构函数的顺序是什么?
- 向量推回调用析构函数时调用析构函数
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++,我应该调用析构函数吗?
- 如何获取有关在 Clang LibTooling 中调用析构函数的信息?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 为什么这里不调用析构函数
- 在调用 std::bind 的产品后意外调用析构函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 如何在C++中调用析构函数
- 为什么为未删除的对象调用析构函数?
- 调用析构函数时出错
- C++ 在不释放内存的情况下调用析构函数
- 为什么在运算符删除中不调用析构函数?
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 在 postOrderDelete 上调用析构函数时引发的异常