不是说new了一个内存以后在不需要的时候应该释放吗?
但为什么MFC向导创建的部分找不到释放的部分呢?
比如下面这段代码.new了好多,没见到一个释放,如果要删除一个不用的按钮,那么我用的是函数删除的,那样不是泄露了吗?void CMainFrame::InitializeRibbon()
{
BOOL bNameValid; CString strTemp;
bNameValid = strTemp.LoadString(IDS_RIBBON_FILE);
ASSERT(bNameValid); // 加载面板图像:
m_PanelImages.SetImageSize(CSize(16, 16));
m_PanelImages.Load(IDB_BUTTONS); // 初始主按钮:
m_MainButton.SetImage(IDB_MAIN);
m_MainButton.SetText(_T("\nf"));
m_MainButton.SetToolTipText(strTemp); m_wndRibbonBar.SetApplicationButton(&m_MainButton, CSize (45, 45));
CMFCRibbonMainPanel* pMainPanel = m_wndRibbonBar.AddMainCategory(strTemp, IDB_FILESMALL, IDB_FILELARGE); bNameValid = strTemp.LoadString(IDS_RIBBON_NEW);
ASSERT(bNameValid);
pMainPanel->Add(new CMFCRibbonButton(ID_FILE_NEW, strTemp, 0, 0));
bNameValid = strTemp.LoadString(IDS_RIBBON_OPEN);
ASSERT(bNameValid);
pMainPanel->Add(new CMFCRibbonButton(ID_FILE_OPEN, strTemp, 1, 1));
bNameValid = strTemp.LoadString(IDS_RIBBON_SAVE);
ASSERT(bNameValid);
pMainPanel->Add(new CMFCRibbonButton(ID_FILE_SAVE, strTemp, 2, 2));
bNameValid = strTemp.LoadString(IDS_RIBBON_SAVEAS);
ASSERT(bNameValid);
pMainPanel->Add(new CMFCRibbonButton(ID_FILE_SAVE_AS, strTemp, 3, 3)); bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT);
ASSERT(bNameValid);
CMFCRibbonButton* pBtnPrint = new CMFCRibbonButton(ID_FILE_PRINT, strTemp, 6, 6);
pBtnPrint->SetKeys(_T("p"), _T("w"));
bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_LABEL);
ASSERT(bNameValid);
pBtnPrint->AddSubItem(new CMFCRibbonLabel(strTemp));
bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_QUICK);
ASSERT(bNameValid);
pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT_DIRECT, strTemp, 7, 7, TRUE));
bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_PREVIEW);
ASSERT(bNameValid);
pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT_PREVIEW, strTemp, 8, 8, TRUE));
bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_SETUP);
ASSERT(bNameValid);
pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT_SETUP, strTemp, 11, 11, TRUE));
pMainPanel->Add(pBtnPrint);
pMainPanel->Add(new CMFCRibbonSeparator(TRUE)); bNameValid = strTemp.LoadString(IDS_RIBBON_CLOSE);
ASSERT(bNameValid);
pMainPanel->Add(new CMFCRibbonButton(ID_FILE_CLOSE, strTemp, 9, 9)); bNameValid = strTemp.LoadString(IDS_RIBBON_RECENT_DOCS);
ASSERT(bNameValid);
pMainPanel->AddRecentFilesList(strTemp); bNameValid = strTemp.LoadString(IDS_RIBBON_EXIT);
ASSERT(bNameValid);
pMainPanel->AddToBottom(new CMFCRibbonMainPanelButton(ID_APP_EXIT, strTemp, 15)); //// 为“剪贴板”面板添加“主”类别:
bNameValid = strTemp.LoadString(IDS_RIBBON_HOME);
ASSERT(bNameValid);
CMFCRibbonCategory* pCategoryHome = m_wndRibbonBar.AddCategory(strTemp, IDB_WRITESMALL, IDB_WRITELARGE); //// 创建“剪贴板”面板:
//bNameValid = strTemp.LoadString(IDS_RIBBON_CLIPBOARD);
//ASSERT(bNameValid);
//CMFCRibbonPanel* pPanelClipboard = pCategoryHome->AddPanel(strTemp, m_PanelImages.ExtractIcon(27)); //bNameValid = strTemp.LoadString(IDS_RIBBON_PASTE);
//ASSERT(bNameValid);
//CMFCRibbonButton* pBtnPaste = new CMFCRibbonButton(ID_EDIT_PASTE, strTemp, 0, 0);
//pPanelClipboard->Add(pBtnPaste); //bNameValid = strTemp.LoadString(IDS_RIBBON_CUT);
//ASSERT(bNameValid);
//pPanelClipboard->Add(new CMFCRibbonButton(ID_EDIT_CUT, strTemp, 1));
//bNameValid = strTemp.LoadString(IDS_RIBBON_COPY);
//ASSERT(bNameValid);
//pPanelClipboard->Add(new CMFCRibbonButton(ID_EDIT_COPY, strTemp, 2));
//bNameValid = strTemp.LoadString(IDS_RIBBON_SELECTALL);
//ASSERT(bNameValid);
//pPanelClipboard->Add(new CMFCRibbonButton(ID_EDIT_SELECT_ALL, strTemp, -1)); // 创建和添加“视图”面板:
bNameValid = strTemp.LoadString(IDS_RIBBON_VIEW);
ASSERT(bNameValid);
CMFCRibbonPanel* pPanelView = pCategoryHome->AddPanel(strTemp, m_PanelImages.ExtractIcon (7)); CMFCRibbonButtonsGroup* pButtonsGroup1 = new CMFCRibbonButtonsGroup;
pButtonsGroup1->AddButton(new CMFCRibbonButton (ID_VIEW_STATUS_BAR, _T("") ,0));
pButtonsGroup1->AddButton(new CMFCRibbonButton (ID_VIEW_TEMPLATE, _T("") ,1));
pButtonsGroup1->AddButton(new CMFCRibbonButton (ID_VIEW_CONTROLS_LIST, _T("") ,2));
pButtonsGroup1->AddButton(new CMFCRibbonButton (ID_VIEW_CONTROLS_PROPERTY, _T("") ,3));
pButtonsGroup1->AddButton(new CMFCRibbonButton (ID_VIEW_OUTPUT, _T("") ,4));
pButtonsGroup1->AddButton(new CMFCRibbonButton (ID_VIEW_RESET, _T(""), 5));
pPanelView->Add(pButtonsGroup1); // 创建和添加“操作”面板:
CMFCRibbonPanel* pPanelOperation = pCategoryHome->AddPanel(_T("操作"), m_PanelImages.ExtractIcon (7));
pPanelOperation->Add(new CMFCRibbonButton (ID_OPERATION_DISPLAYDATA, _T("显示数据\nf"), -1, 1));
pPanelOperation->Add(new CMFCRibbonButton (ID_OPERATION_DELETEDATA, _T("删除数据\nd"), -1, 1));
pPanelOperation->Add (new CMFCRibbonSeparator); // 将元素添加到选项卡右侧:
bNameValid = strTemp.LoadString(IDS_RIBBON_STYLE);
ASSERT(bNameValid);
CMFCRibbonButton* pVisualStyleButton = new CMFCRibbonButton(-1, strTemp, -1, -1); pVisualStyleButton->SetMenu(IDR_THEME_MENU, FALSE /* 无默认命令*/, TRUE /* 右对齐*/); bNameValid = strTemp.LoadString(IDS_RIBBON_STYLE_TIP);
ASSERT(bNameValid);
pVisualStyleButton->SetToolTipText(strTemp);
bNameValid = strTemp.LoadString(IDS_RIBBON_STYLE_DESC);
ASSERT(bNameValid);
pVisualStyleButton->SetDescription(strTemp);
m_wndRibbonBar.AddToTabs(pVisualStyleButton); //右侧帮助元素
bNameValid = strTemp.LoadString(IDS_RIBBON_HELP);
ASSERT(bNameValid);
CMFCRibbonButton* pOnlineHelpButton = new CMFCRibbonButton(ID_ONLINE_HELP, strTemp, -1, -1);
m_wndRibbonBar.AddToTabs(pOnlineHelpButton); ////////////////////////////////////////////////////////////////////////////
//右侧更新元素
bNameValid = strTemp.LoadString(IDS_RIBBON_UPDATA);
ASSERT(bNameValid);
CMFCRibbonButton* pSoftwareUpButton = new CMFCRibbonButton(ID_DATA_UP, strTemp, -1, -1);
m_wndRibbonBar.AddToTabs(pSoftwareUpButton); ////////////////////////////////////////////////////////////////////////////
//右侧注册元素
bNameValid = strTemp.LoadString(IDS_RIBBON_KEY);
ASSERT(bNameValid);
CMFCRibbonButton* pSoftwareKeyButton = new CMFCRibbonButton(ID_SOFT_KEY, strTemp, -1, -1);
m_wndRibbonBar.AddToTabs(pSoftwareKeyButton); // 添加快速访问工具栏命令:
CList<UINT, UINT> lstQATCmds; lstQATCmds.AddTail(ID_FILE_NEW);
lstQATCmds.AddTail(ID_FILE_OPEN);
lstQATCmds.AddTail(ID_FILE_SAVE);
lstQATCmds.AddTail(ID_FILE_PRINT_DIRECT); m_wndRibbonBar.SetQuickAccessCommands(lstQATCmds); m_wndRibbonBar.AddToTabs(new CMFCRibbonButton(ID_APP_ABOUT, _T("\na"), m_PanelImages.ExtractIcon (0)));
}

解决方案 »

  1.   

    实际上是有释放的 new出来的内存 因为不会自动释放 所以不一定是在new他的函数写完之后 就不要用了
    它可以在函数内new 却在这个函数外被delete
      

  2.   

    一般来讲,对于应用程序,new后你不显式的释放,在程序退出后,系统会自动帮你释放,但是对于内核驱动来说,创建的堆,如果不释放,除非系统重启,否则那块内存就无法使用。但是,严格来讲,不管应用程序也好,内核驱动也好,NEW后,如果你不再使用了,就将其释放,这样可以节省出内存给用户,要不然,有可能,你的系统有可能内存不足了~
      

  3.   

    CMFCRibbonMainPanel* pMainPanel = m_wndRibbonBar.AddMainCategory(strTemp, IDB_FILESMALL, IDB_FILELARGE);    bNameValid = strTemp.LoadString(IDS_RIBBON_NEW);
        ASSERT(bNameValid);
        pMainPanel->Add(new CMFCRibbonButton(ID_FILE_NEW, strTemp, 0, 0));
    ===================
    这里new出来的对象是由pMainPanel管理的。只有pMainPanel才能决定这些对象是否还有用。你应该可以在CMFCRibbonMainPanel类的源码中找到这些对象的delete操作。
      

  4.   

    谁申请,谁释放
    你NEW的,那就你释放,系统NEW的,别担心,它会自己释放的,只不过位置可能不在这里
      

  5.   

    pMainPanel->Add(new CMFCRibbonButton(ID_FILE_NEW, strTemp, 0, 0));pMainPanel会帮你释放的。