c++ - 为什么我的类析构函数会立即被调用?

标签 c++ mfc

我有一个非常简单的类,它在线程中的函数完成时通知父线程。问题是在实例化它时,调用构造函数,然后立即调用析构函数。这是类(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/

相关文章:

c++ - 引用声明是否为引用对象引入了一个新名称?

c++ - 如何在 MFC 常规 DLL 中创建和使用 CFormView? ( Visual Studio 2008)

c++ - 图形用户界面设计帮助 - MFC

c++ - Qt jom.exe错误2

c++ - 将 std::bind2nd 与引用一起使用

c++ - 如何使用 HiRedis 异步发布

c++ - 删除 QListWidgetItem:QListWidget::takeItem(item) vs 删除项目

c++ - 有没有一种简单的方法来对 CObList 进行排序?

c++ - 如何知道 std::string/Cstring 中的值是否为数字

c++ - MFC:以编程方式检索按钮 ID