没有足够的时间让析构函数完成?

时间:2017-04-13 20:31:08

标签: c++ mfc

如果我说析构函数突然存在没有机会完成,这是否有意义,因为当所有这些都发生在同一(主)线程中时,UI窗口已被取消?

当我在对话框中按“取消”时,我想释放与列表时间相关的内存:

CMyListCtrl::~CMyListCtrl()
{
    ItemData* pItemData;
    int nItems = GetItemCount(); <- errors out here and it is called
    for(int i=0; i<nItems; i++)
    {
        pItemData = (ItemData*)GetItemData(i);
        if(pItemData != NULL)
            delete pItemData;
    }
}

我的OnCancel()处理程序位于

的位置
LONG CSetupDlg::OnCancel(UINT wParam, LONG lParam)
{
    ((CSetupDoc *)GetActiveDocument())->Exit();
    return 0;
}

void CSetupDoc::Exit()
{
    GetDocTemplate()->CloseAllDocuments(TRUE);
}

析构函数的调用主要是因为CloseAllDocuments()调用,但是当它试图清理时它会在中间被吹,我甚至无法单步执行它。如果我注释CloseAllDocuments()调用,那么窗口永远不会被破坏,析构函数永远不会被调用,所以析构函数肯定与这个函数绑定,它们显然在同一个线程中。

为什么它断言好像基础窗口神奇地消失了什么?

我收到的错误消息是MyApp has triggered a breakpoint,我无法再继续介绍它。

3 个答案:

答案 0 :(得分:2)

您似乎无法从析构函数中访问列表控件的功能。我不记得这是否是一个规则,或者是否由于您的代码中的其他奇怪情况而发生。可能通常情况下,你不能这样做。

在任何情况下,您可能希望尝试在列表控件的WM_DESTROY消息的处理程序中进行清理,而不是列表控件的析构函数。

答案 1 :(得分:1)

你等了太久了。在析构函数中已经太晚了。此时,窗口句柄(m_hWnd)不再有效,Windows已破坏窗口。列表控件中的项目此时已全部删除。正如其他人所指出的那样,将自己的CMyListCtrl :: OnDestroy()函数和ON_WM_DESTROY()宏添加到CMyListCtrl消息映射中。将清理代码放在OnDestroy()函数中。

答案 2 :(得分:1)

我发布了解决问题的正确答案。我们需要释放select lgproduct.brand_id, brand_name, brand_type, round(avg(prod_price), 2) from boff.lgproduct, boff.lgbrand where lgproduct.brand_id = lgbrand.brand_id group by lgproduct.brand_id, brand_name, brand_type having round(avg(prod_price), 2) = ( select max(round(avg(prod_price), 2)) from boff.lgproduct, boff.lgbrand where lgproduct.brand_id = lgbrand.brand_id group by lgproduct.brand_id, brand_name, brand_type ) order by lgproduct.brand_id; 消息处理程序中的列表内存(即使LVN_DELETEITEM没有工作,列表已经消失了。)

OnDestroy()

析构函数断言/不执行是因为void CMyListCtrl::OnLvnDeleteitem(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); // TODO: Add your control notification handler code here ItemData* pItemData = (ItemData* )pNMLV->lParam; delete pItemData; *pResult = 0; } 在列表窗口上运行,但由于它已被销毁,因此行为未知。