如果我说析构函数突然存在没有机会完成,这是否有意义,因为当所有这些都发生在同一(主)线程中时,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
,我无法再继续介绍它。
答案 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;
}
在列表窗口上运行,但由于它已被销毁,因此行为未知。