关于new的申请与释放

dnyz520 2009-10-14 02:16:59
不是说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)));
}
...全文
203 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Benjamin_Hua 2009-10-16
  • 打赏
  • 举报
回复
pMainPanel->Add(new CMFCRibbonButton(ID_FILE_NEW, strTemp, 0, 0));

pMainPanel会帮你释放的。
dnfreeuser 2009-10-14
  • 打赏
  • 举报
回复
谁申请,谁释放
你NEW的,那就你释放,系统NEW的,别担心,它会自己释放的,只不过位置可能不在这里
快乐鹦鹉 2009-10-14
  • 打赏
  • 举报
回复
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操作。
A1erX 2009-10-14
  • 打赏
  • 举报
回复
一般来讲,对于应用程序,new后你不显式的释放,在程序退出后,系统会自动帮你释放,但是对于内核驱动来说,创建的堆,如果不释放,除非系统重启,否则那块内存就无法使用。

但是,严格来讲,不管应用程序也好,内核驱动也好,NEW后,如果你不再使用了,就将其释放,这样可以节省出内存给用户,要不然,有可能,你的系统有可能内存不足了~
an_bachelor 2009-10-14
  • 打赏
  • 举报
回复
实际上是有释放的 new出来的内存 因为不会自动释放 所以不一定是在new他的函数写完之后 就不要用了
它可以在函数内new 却在这个函数外被delete

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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