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

扎尔

我有一个非常简单的类,当线程中的函数完成时会通知父线程。问题是实例化它时,将调用构造函数,然后立即调用析构函数。这是课程:

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,但仍然没有用。有人为什么立即调用析构函数?

谢尔盖·卡里尼琴科(Sergey Kalinichenko)

立刻调用析构函数,因为此行

AutoNotify( dlg->m_hWnd );

创建一个临时对象,该对象会立即删除。

这行创建一个非临时对象:

AutoNotify guard( dlg->m_hWnd );

现在,仅当guard对象超出范围时,才会调用析构函数

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么不调用继承类的析构函数?

为什么在父类之前调用子类的析构函数?

为什么要调用派生类的析构函数?

为什么在构造时调用C ++类的析构函数?

C ++我听不懂为什么要调用“父类静态函数”,而只调用父析构函数

为什么要调用析构函数

为什么不调用析构函数?

C ++为什么在堆栈中构造完对象后立即调用析构函数?

为什么std :: vector的构造函数调用自定义类的析构函数?

在派生类构造函数中引发异常。为什么调用基类析构函数而不是派生类析构函数?

为什么析构函数比构造函数调用得更多?

为什么在Friend函数中调用析构函数

为什么 C++ 中类字段的默认初始化需要析构函数调用?

当我单击控制台上的关闭按钮时,为什么不调用析构函数?

为什么析构函数被两次调用时我的程序不会崩溃

为什么在抛出我的析构函数时没有调用 std::terminate

为什么析构函数会不断地自我调用(导致堆栈溢出)?

为什么std :: shared_ptr两次调用我的析构函数?

为什么每次我迭代它们时都会调用向量中结构的析构函数?

为什么该标准允许我免费存储没有析构函数的类?

为什么代码两次调用析构函数?

为什么在执行复制之前调用析构函数?

为什么调用从对象移出的析构函数?

为什么析构函数被调用两次?

为什么析构函数调用两次表单?

为什么在复制分配期间调用析构函数?

为什么 C++ 线程多次调用析构函数?

为什么在“返回 0”后调用析构函数?

为什么此析构函数不必删除类对象?