创建新的 CMFCDesktopAlertWnd 时,何时删除分配的内存

When creating a new CMFCDesktopAlertWnd, when is the allocated memory deleted?

本文关键字:删除 分配 何时 内存 CMFCDesktopAlertWnd 创建      更新时间:2023-10-16

有关如何创建桌面警报的大多数示例如下所示。它使用 new 关键字创建一个新的 CMFCDesktopAlertWnd,用于创建 CMFCDesktopAlertDialog。这些示例都没有删除函数末尾的对象,因此我想有些东西正在解除分配内存。什么在解除分配内存?

CMFCDesktopAlertWnd* pPopup = new CMFCDesktopAlertWnd;
// int m_nAnimation
pPopup->SetAnimationType ((CMFCPopupMenu::ANIMATION_TYPE) m_nAnimation);
// int m_nAnimationSpeed
pPopup->SetAnimationSpeed (m_nAnimationSpeed);
// int m_nTransparency
pPopup->SetTransparency ((BYTE)m_nTransparency);
// BOOL m_bSmallCaption
pPopup->SetSmallCaption (m_bSmallCaption);
// BOOL m_bAutoClose, int m_nAutoCloseTime
pPopup->SetAutoCloseTime (m_bAutoClose ? m_nAutoCloseTime * 1000 : 0);
// int m_nPopupSource
if (m_nPopupSource == 0)
{
   // int m_nVisualMngr
   // CPoint m_ptPopup
   // The this pointer points to a CDesktopAlertDemoDlg class which extends the CDialogEx class.
   if (m_nVisualMngr == 5)  // MSN-style
   {
      pPopup->Create (this, IDD_DIALOG2, NULL, m_ptPopup, RUNTIME_CLASS (CMSNDlg));
   }
   else
   {
      pPopup->Create (this, IDD_DIALOG1, 
      m_menuPopup.GetSubMenu (0)->GetSafeHmenu (), m_ptPopup, RUNTIME_CLASS (CMyPopupDlg));
   }
}

你可以看看源代码:

void CMFCDesktopAlertWnd::OnNcDestroy()
{
    CWnd::OnNcDestroy();
    delete this;
}

销毁窗口后,WM_NCDESTROY消息将删除分配的内存。

Microsoft建议删除这属于PostNcDestroy()而不是OnNcDestroy()方法,并且我一直看到一些崩溃,其中comctl32!ComboBox_WndProc()试图在删除时引用释放的内存过早完成,即在OnNcDestroy().