hur.cn - 华软网

 热门搜索

看孙老师视频时的疑惑

  作者:未知    来源:网络    更新时间:2011/9/26
在看孙老师的菜单那章时,有Detach()的用法,如下:(主要部分,其他部分省略)

Cview::Oncreate()
{
         ..........

         CMenu menu;
         menu.LoadMenu(IDR_MAINFRAME);
SetMenu(&menu);
menu.Detach();
return 0;
}


主要就是说用Detach()把菜单资源和菜单对象的联系断开,当时我也认同。

但!!!!!!当我看到对话框时,孙老师讲到了创建对话框时有以下代码


void CBoboView::OnDilog() 
{
// TODO: Add your command handler code here

CTestDilog *pDlg=new CTestDilog;
pDlg->Create(IDD_DIALOG1,this);
pDlg->ShowWindow(SW_SHOW);


}

孙老师说此段代码不能用局部变量,我想起了Detach(),于是试着下了以下代码

void CBoboView::OnDilog() 
{
// TODO: Add your command handler code here


         CTestDilog dlg;
         dlg.Create(IDD_DIALOG1,this);
         dlg.ShowWindow(SW_SHOW);
         dlg.Detach();



}


而然运行结果却证明我错了,运行时会出错。


所以,小弟非常困惑,为什么menu行,dialog就不行呢?


据孙老师的意思是,要在堆内存中申请内存,于是用了new,但这样岂不是在函数结束时指针的栈内存被析构,而对象所占得堆内存不会被析构,结果岂不是会内存泄露吗?


小弟结帖率100%,望各位大大挺我。帮我解决我疑惑。
---华软 网友回答---
menu.Detach(); 的作用是 切断 menu 对象 和 菜单资源的联系
也就是menu 的析构函数 被调用时 不会 释放 菜单资源 所占的内存 他还是在内存里面
---华软网友回复---
申明一点建立类好好多方法:1.栈中分配,如CMenu 2.用new在堆中分配,用delete 释放(析构)其他...
楼主的疑惑其实就是建立对象何时在栈中分配,何时在堆中分配对象,其实假设不考虑类,c里面的静态变量和自动变量的区别:
看如下代码:
char * foo(void)
{ int a;
  char str[100];
 
}
函数要实现 str变量在函数外使用,该定义什么样的变量,有两种方法:
  定义成静态的static char str[100]; 或者 char *str = (char *)mallloc(100);
具体到CMenu和Cdialog(非模态对话框)的区别就是
CMenu 可用new也可以不用,但Cdialog(非模态对话框)则必须要用new,这是由于非模态对话框的特性决定的:
   看如下代码 
  void foo(void)
{
  //模态对话框的运行轨迹
   CDialog dlg;
   dlg.DoModal()
   AfxMessageBox(”对话框关闭后才能运行到我“)
  
}而非模态对话框则不同
void foo(void)
{
   CTestDilog *pDlg=new CTestDilog;
   pDlg->Create(IDD_DIALOG1,this);
   pDlg->ShowWindow(SW_SHOW);
   AfxMessageBox(”对话框关还没显示就运行到我了“)
}
很明晰,建立非模态对话框只能用new,而不能在栈中分配,因为函数结束后,对象就消失(析构了)。

---华软网友回复---
二楼说得很好啦!++
---华软网友回复---
引用 2 楼 gameslq 的回复:
申明一点建立类好好多方法:1.栈中分配,如CMenu 2.用new在堆中分配,用delete 释放(析构)其他...
楼主的疑惑其实就是建立对象何时在栈中分配,何时在堆中分配对象,其实假设不考虑类,c里面的静态变量和自动变量的区别:
看如下代码:
char * foo(void)
{ int a;
  char str[100];
 
}
函数要实现 str变量在函数外使用,该定义……
那么为什么CDialog(非模态对话框)不能用Detach()?
---华软网友回复---
CTestDilog popup属性改成child不就可以了?
---华软网友回复---
学习 学习      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。