回 帖 发 新 帖 刷新版面

主题:这样制作MODELESS对话框好吗

这是制作MODELESS对话框的一段代码。
void CMmDlg::OnModeless() 
{
    // TODO: Add your control notification handler code here
    // TODO: Add your control notification handler code here
    CString str = "非模式对话框";
           CBuildDialog  *NewDialog;
    NewDialog = new CBuildDialog;
    NewDialog->m_Type.Format("%s",str);
    NewDialog->Create(IDD_NEWDIALOG);
    NewDialog->ShowWindow(SW_RESTORE);
}

MSDN上说产生MODELESS对话框要用Create(),第一种方式如上面的代码所述;第二种改写对话框的构造函数,即在对话框构造函数的最后添加一个Create函数的调用。

对于第一种情况我有点疑问。现在在看 戴博 周杨 龚涛 李仪 等编著的visual c++程序员成长攻略。这个代码是从这本书上抄来的。
我的疑问是new了一个对象后没有调用delete,是否会造成内存泄露。因为函数结束后好像没有handle能够供我们找到这个存在于堆里对象。

下面的方式会在函数退出后由析构函数释放资源
void CMmDlg::OnModel() 
{
    // TODO: Add your control notification handler code here
    CString str = "模式对话框";
           CBuildDialog  NewDialog;
    NewDialog.m_Type.Format("%s",str);
    NewDialog.DoModal();
}

MODELESS对话框在函数结束后仍然有效,因为对话框没有销毁时,程序仍然能够执行下去。那么如果第一个部分代码没有造成内存泄露,它的机制是怎样的。

回复列表 (共1个回复)

沙发

看完MSDN关于对话框的说明。这样确实会造成内存的泄露,处理办法是对于MODELESS对话框类需要改写onCancel函数在其中调用DestroyWindow来完成资源的释放。那么是不是model和MODELESS对话框就不能用同一个类来实例化。因为即使构造函数可以重载,onCancel是没办法重载的,也没办法在其中判断此对话框是MODELESS还model。
如果这个MODELESS对话是在声明时用添加了Create函数的构造函数产生的,只用在OnCancel中添加DestroyWindow,如果使用new产生还要改写PostNcDestroy函数。

本书的这个示例程序用一个类实例化两种对话框是不可取的。可见……,学好真不容易啊。

这是看visual studio 2005 的出的结论,vc98中的Win类没有好像PostNcDestroy成员函数,反正我在我这装的98版配套的MSDN中美搜索道这个函数。
那么vc6.0中是如何处理这种内存问题的呢?是不是只用在OnCancel中添加DestroyWindow。DestroyWindow的参数是handle,我该如何取得需要本窗口的handle呢?
希望各位前辈给予解答,谢谢!

我来回复

您尚未登录,请登录后再回复。点此登录或注册