[请教]这样写代码有内存泄露的有关问题吗
[请问]这样写代码有内存泄露的问题吗?
请大家帮我看看我这样写有内存泄露的问题吗。
例如,
CMainFrame里定义了一个对话框对象指针的成员变量,如下
CMyView
{
...
CDialog* mp_wnd;
...
}
CMyView派生自CFormView,
CMyView中定义了这样一个对话框类指针的成员变量,如下,
CMyView
{
...
CMyDialog* mp_dlgMine;
...
}
另外,CMyView上有两个按钮,按钮1,单击它的响应函数的动作包括,
{
mp_dlgMine = new CMyDialog;
mp_dlgMine-> Create(IDD_MINE, this);
mp_dlgMine-> SetWindowPos(...);
CMainFrame* p_mf = (CMainFrame*)AfxGetMainWnd();
p_mf-> mp_dlg = mp_dlgMine;
...
}
按钮2,单击它的响应函数的动作为
{
CMainFrame* p_mf = (CMainFrame*)AfxGetMainWnd();
(p_mf-> mp_dlg)-> DestroyWindow;
delete p_mf-> mp_dlg;
}
我是想实现Form View中的Child对话框的“下一步”“上一步”功能,不知道这样会不会有内存泄露的问题。
我为什么有这样的疑问:
1.我看了一下内存,“delete p_mf-> mp_dlg;”这一句“似乎”没有改变什么,而如果我是在CMyDialog的OnCancel中delete this;能看到this指针所指内存有变化;
2.程序似乎不是很稳定,我是在WinCE模拟器下做的,反复单击按钮1和按钮2,偶尔会出现问题,抱错,似乎是报wincore.cpp的错。
------解决方案--------------------
使用boundcheck检测一下不就知道了吗?
------解决方案--------------------
不会泄露,不过别忘了删除之后 = NULL
还有,debug模式下的output窗口会有内存泄露的指示的
另外,为啥要用这种方式实现wizard呢?
------解决方案--------------------
如果你按了1之后不按2,接着按1,原来的内存就泄露了。
如果你不按1,总是按2就会出错了。即p_mf-> mp_dlg;并没有指向一个new的空间。
或p_mf-> mp_dlg指向的空间已经释放过了。你在释放就会出错。
所以在初始化的时候将mp_dlg = NULL;
在delete后: p_mf-> mp_dlg = NULL;
请大家帮我看看我这样写有内存泄露的问题吗。
例如,
CMainFrame里定义了一个对话框对象指针的成员变量,如下
CMyView
{
...
CDialog* mp_wnd;
...
}
CMyView派生自CFormView,
CMyView中定义了这样一个对话框类指针的成员变量,如下,
CMyView
{
...
CMyDialog* mp_dlgMine;
...
}
另外,CMyView上有两个按钮,按钮1,单击它的响应函数的动作包括,
{
mp_dlgMine = new CMyDialog;
mp_dlgMine-> Create(IDD_MINE, this);
mp_dlgMine-> SetWindowPos(...);
CMainFrame* p_mf = (CMainFrame*)AfxGetMainWnd();
p_mf-> mp_dlg = mp_dlgMine;
...
}
按钮2,单击它的响应函数的动作为
{
CMainFrame* p_mf = (CMainFrame*)AfxGetMainWnd();
(p_mf-> mp_dlg)-> DestroyWindow;
delete p_mf-> mp_dlg;
}
我是想实现Form View中的Child对话框的“下一步”“上一步”功能,不知道这样会不会有内存泄露的问题。
我为什么有这样的疑问:
1.我看了一下内存,“delete p_mf-> mp_dlg;”这一句“似乎”没有改变什么,而如果我是在CMyDialog的OnCancel中delete this;能看到this指针所指内存有变化;
2.程序似乎不是很稳定,我是在WinCE模拟器下做的,反复单击按钮1和按钮2,偶尔会出现问题,抱错,似乎是报wincore.cpp的错。
------解决方案--------------------
使用boundcheck检测一下不就知道了吗?
------解决方案--------------------
不会泄露,不过别忘了删除之后 = NULL
还有,debug模式下的output窗口会有内存泄露的指示的
另外,为啥要用这种方式实现wizard呢?
------解决方案--------------------
如果你按了1之后不按2,接着按1,原来的内存就泄露了。
如果你不按1,总是按2就会出错了。即p_mf-> mp_dlg;并没有指向一个new的空间。
或p_mf-> mp_dlg指向的空间已经释放过了。你在释放就会出错。
所以在初始化的时候将mp_dlg = NULL;
在delete后: p_mf-> mp_dlg = NULL;