动态创建选项卡照成内存泄漏

heshaai6843 2018-07-07 04:48:37
大神们,今天写个小项目调试的时候突然发现内存泄露了


我看看内存块,然后用_CrtSetBreakAlloc去定位,最后发现泄露的位置竟然在我动态创建选项卡的地方
我已经把new出来的指针全部释放了,想问还能有什么原因造成Create泄露呢

代码

选项卡初始化
void CtabView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();


CRect rc;
GetClientRect(rc);

_CrtSetBreakAlloc(373);
if (!m_tab.Create(CMFCTabCtrl::STYLE_3D_ONENOTE, rc, this, 1, CMFCTabCtrl::LOCATION_TOP,0)) //定位内存泄露的地方
{
return ;
}
//定位这里运行没问题
m_dlg1=new CDialog1;
m_dlg2=new CDialog2;
m_dlg3=new CDialog3;

m_dlg1->Create(IDD_DIALOG1,&m_tab);
m_dlg1->SetFont(&afxGlobalData.fontRegular);
m_dlg1->SetWindowTextW(L"Listctrl控件");

m_dlg2->Create(IDD_DIALOG2,&m_tab);
m_dlg2->SetFont(&afxGlobalData.fontBold);
m_dlg2->SetWindowTextW(L"还没想好些什么控件");

m_dlg3->Create(IDD_DIALOG3,&m_tab);
m_dlg3->SetFont(&afxGlobalData.fontDefaultGUIBold);
m_dlg3->SetWindowTextW(L"还有什么控件比较难写吗");

m_imglist.Create(32, 32, ILC_COLOR32 | ILC_MASK, 3, 1);
m_imglist.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
m_imglist.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
m_imglist.Add(AfxGetApp()->LoadIcon(IDI_ICON4));
m_tab.SetImageList(m_imglist);

m_tab.AddTab(m_dlg1,L"Listctrl控件",0,TRUE);
m_tab.AddTab(m_dlg2,L"还没想好些什么控件",1,FALSE);
m_tab.AddTab(m_dlg3,L"还有什么控件比较难写吗",2,FALSE);

//m_tab.SetLocation (CMFCTabCtrl::LOCATION_BOTTOM);//Tab标签在底部
m_tab.SetLocation (CMFCTabCtrl::LOCATION_TOP);//Tab标签在顶部

m_tab.EnableActiveTabCloseButton();//是否添加关闭选项卡按钮

m_tab.SetActiveTab(0); //激活选项卡,以当前选项卡为第一页。

//m_tab.ModifyTabStyle (style);//设置CMFCTabCtrl的样式

CArray<COLORREF, COLORREF> arColors;
arColors.Add (RGB (121, 210, 231));
arColors.Add (RGB (190, 218, 153));
arColors.Add (RGB (255, 170, 100));

m_tab.EnableAutoColor (TRUE);
m_tab.SetAutoColors (arColors);

m_tab.EnableTabSwap (TRUE);//可以拖拽
//m_tab.EnableTabSwap (FALSE);//不可拖拽
}


我在析构里释放指针
CtabView::~CtabView()
{
if(m_dlg1)
{
delete m_dlg1;
m_dlg1 = NULL;
}

if(m_dlg2)
{
delete m_dlg2;
m_dlg2 = NULL;
}

if(m_dlg3)
{
delete m_dlg3;
m_dlg3 = NULL;
}
}
...全文
108 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
heshaai6843 2018-07-09
  • 打赏
  • 举报
回复
引用 2 楼 schlafenhamster 的回复:
原因在于VS2008中MFC程序中的应用程序类都派生自CWinAppEx,VS 2008的程序里有一个CMFCVisualManager类的全局对象,负责管理可视化界面,具体来说就是一个单件(设计模式中的单件模式),CWinAppEx类的ExitInstance函数可以析构这个对象。但是以往的MFC程序的应用程序类都派生自CWinApp,因为需要在ExitInstance函数手动这个类对象,具体就是在应用程序类的ExitInstance函数添加代码



CMFCVisualManager::DestroyInstance( TRUE );

非常感谢
schlafenhamster 2018-07-07
  • 打赏
  • 举报
回复
原因在于VS2008中MFC程序中的应用程序类都派生自CWinAppEx,VS 2008的程序里有一个CMFCVisualManager类的全局对象,负责管理可视化界面,具体来说就是一个单件(设计模式中的单件模式),CWinAppEx类的ExitInstance函数可以析构这个对象。但是以往的MFC程序的应用程序类都派生自CWinApp,因为需要在ExitInstance函数手动这个类对象,具体就是在应用程序类的ExitInstance函数添加代码



CMFCVisualManager::DestroyInstance( TRUE );
schlafenhamster 2018-07-07
  • 打赏
  • 举报
回复
搜索 CMFCVisualManage

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧