资源被释放的问题

baifanmvp 2008-10-23 08:25:42
我看孙鑫的视频,在建一个对话框的时候,他说用个对象去创建对话框,而且强调对象必须在VIEW类里定义为成员变量,不能定义到成员函数里面,不然函数结束,对象就销毁了,就出不了对话框,但是他又说这样定义到成员函数里面是可以的
CTESTDig *a=new CTESTDig() //对话框变量
为什么可以这样,难道在函数里申请动态内存 ,函数结束就不会被销毁么?
...全文
169 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
giant1st 2008-10-23
  • 打赏
  • 举报
回复
一般在 VC中 直接在资源视图里 创建 对话框,在点击某个菜单 需要弹出对话框的时候
用对话框的对象(变量而非指针)就好了,你 New了还得 Delete,麻烦

参考:http://download.csdn.net/source/702573

这种问题 很简单的
帅得不敢出门 2008-10-23
  • 打赏
  • 举报
回复
局部变量栈上的话,出了作用域就会被系统自动释放的.
帅得不敢出门 2008-10-23
  • 打赏
  • 举报
回复
自己new出来的
就要自己负责delete/delete[]
帅得不敢出门 2008-10-23
  • 打赏
  • 举报
回复
class CMenu : public CObject

Remarks

It provides member functions for creating, tracking, updating, and destroying a menu.

Create a CMenu object on the stack frame as a local, then call CMenu's member functions to manipulate the new menu as needed. Next, call CWnd::SetMenu to set the menu to a window, followed immediately by a call to the CMenu object's Detach member function. The CWnd::SetMenu member function sets the window's menu to the new menu, causes the window to be redrawn to reflect the menu change, and also passes ownership of the menu to the window. The call to Detach detaches the HMENU from the CMenu object, so that when the local CMenu variable passes out of scope, the CMenu object destructor does not attempt to destroy a menu it no longer owns. The menu itself is automatically destroyed when the window is destroyed.

You can use the LoadMenuIndirect member function to create a menu from a template in memory, but a menu created from a resource by a call to LoadMenu is more easily maintained, and the menu resource itself can be created and modified by the menu editor.
freshairfly 2008-10-23
  • 打赏
  • 举报
回复
因为模式对话框是创建--》显示--》用户操作完成--》返回到显示
对话框的地方


这时候代码还没有出那个创建模式对话框的函数,所以对话框资源没有被释放,也就不会有问题。

非模式对话框,是创建显示完对话框后,代码并不等待对话框显示结束,控制就回到了创建非模式对话框的地方了,从而退出了创建对话框对象的函数,如果对话框对象是这个函数的局部变量,就被销毁了,而这个对象还在使用呢,所以出问题了。
scklotz 2008-10-23
  • 打赏
  • 举报
回复
你问题里提到的是非模态对话框吧.模态对话框和非模态对话框的机制不一样的.

模态:
xx_fun()
{
...
CDlg dlg;
dlg.DoModal();
}
这是没问题的.
这是因为DoModal()函数不会返回,直到对话框消失(销毁)


非模态就不能按照上面那样用.必须用View的成员变量或者New出来
因为非模态的对话框出来后,启动非模态对话框的函数立即返回
例如:
CDlg* pdlg = new CDlg;
pdlg->Create();
pdlg->Show();
如果把对话框定义为局部变量,此时局部变量将消失
而对话框还没有消失 这将导致错误
所以必须保证对话框变量在对话框窗口消失前一直存在.
freshairfly 2008-10-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 baifanmvp 的回复:]
o  2楼回答的貌似懂了 就是堆上的生命周期和函数的不同步是吧  还有个类似的问提 麻烦看看

大家请看下面的代码,这是一段自己创建右键菜单的代码,没有打全,但是不影响问题,想问的是为什么menu作为一个读取资源的对象,在这里可以写成一个局部对象,我看过很多的读取资源的对象都要定义成视图类或者什么类的成员变量,定义成了局部的会出问题,但是这里缺没问题,我就搞不懂了,是不是我以上的理解错了啊,谢谢回答!
(me…
[/Quote]
LZ的最开始问题是有问题的,应该说是非模式对话框不能定义到成员函数里面。而模式对话框是可以的,因为模式对话框是等待用户处理完成返回后,才返回到创建对话框的地方的。
菜单比较类似模式对话框,所以没有问题。
sevenhu 2008-10-23
  • 打赏
  • 举报
回复
如果变量在函数中定义,这个变量就是局部变量,在函数结束后就会析构掉。
但如果定义在View类中,就不会。

动态的创建,需要自己去释放.
scklotz 2008-10-23
  • 打赏
  • 举报
回复
menu是局部变量.
TrackPopupMenu弹出菜单,直到菜单消失后,函数才返回.
当超过作用域menu析构函数调用
CMenu::~CMenu()
{ DestroyMenu(); }

"很多的读取资源的对象都要定义成视图类或者什么类的成员变量,定义成了局部的会出问题"
没听说过这样的说法.

天空海阔66 2008-10-23
  • 打赏
  • 举报
回复

#include <stdio.h>

char g_ch="g_hello";//全局字符变量g_ch
int g_weight=100;//全局整型变量g_weight
staic short s_sh_i=100;//静态的全局变量
char *pch_heap=new char[100];//堆中

int Max (int, int); // 全局函数
int main (void) // 全局函数

void main()
{
char local_ch[]="locol_hello";//局部变量在栈中
int local_weigh;//局部变量 在栈中

char *pch_heap_new=new char[100];//堆中,pch_heap_new指向堆中new申请的100个字节的首地址
char *pch_heap_malloc=(char*)malloc(sizeof(char)*100));//堆中同上

delete pch_heap_new;//释放内存
free(pch_heap_malloc);//释放内存

void local_variable_survival_cycle()
{
char local_ch[10]="hello";//局部变量local_ch量的作用范围从这开始 ,进栈
int local_i=100;//局部变量local_i从第二行开始 进栈
}//local_ch,local_i的生存周期结束 ,出栈local_i,local_ch

}
栈是一种先进后出的数据结构。表达式求值,函数调用,局部变量
队是先进先出。消息队列,
hsc168861899 2008-10-23
  • 打赏
  • 举报
回复
你认为menu是局部的吗?我认为cmenu是全局的啊.
haggard_hunan 2008-10-23
  • 打赏
  • 举报
回复
new出来的,自己去delete!
baifanmvp 2008-10-23
  • 打赏
  • 举报
回复
o 2楼回答的貌似懂了 就是堆上的生命周期和函数的不同步是吧 还有个类似的问提 麻烦看看

大家请看下面的代码,这是一段自己创建右键菜单的代码,没有打全,但是不影响问题,想问的是为什么menu作为一个读取资源的对象,在这里可以写成一个局部对象,我看过很多的读取资源的对象都要定义成视图类或者什么类的成员变量,定义成了局部的会出问题,但是这里缺没问题,我就搞不懂了,是不是我以上的理解错了啊,谢谢回答!
(menu没有调用Detach()进行句柄和对象的分离)
CMenu menu;
menu.LoadMenu(CG_IDR_POPUP_MENU_VIEN);
CMenu *pup=menu.GetSubMenu(0);
pup->TrackPopupMenu(TPM_LEFTALIGN,POINT.X,PONT.Y,this);


不是想一贴问2个问题啊 真的是没分了 ,这个问题解决了 立即结贴
m349317345 2008-10-23
  • 打赏
  • 举报
回复
大家进我的编程与硬件交流群呀72651142
xhs_lh04 2008-10-23
  • 打赏
  • 举报
回复
一个是在栈上分配的内存,在函数执行过程中,函数内部变量在栈上创建,函数执行结束后这些存储单元会自动释放,栈内存分配内置在运算器的指令集中,运算效率高,但分配容量有限。
另一个是堆上分配的内存,即动态分配的内存。
函数变量是栈上分配的内存在函数返回时会释放,而动态分配的内在函数返回时不会释放必须显示地调用delete(free)进行释放.对象也是一样.

64,645

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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