详细如下:
        CTestPopDlg *pszWindow;
pszWindow = new CTestPopDlg;//这里内存泄露
pszWindow->Create(IDD_DIALOG1,this->GetDesktopWindow());
pszWindow->ShowWindow(SW_SHOW);
把生成pszWindowlk 加入生成列表中:list<CTestPopDlg *> m_ChatWindow;
         m_ChatWindow.push_back(pszWindow);
最后,关闭窗口时,
        再从ChatWindow删除对话框指针,

解决方案 »

  1.   

    在非模态对话框类中,响应WM_CLOSE消息,调用DestroyWindow函数,再重载PostNcDestroy函数,执行delete this。
      

  2.   

    上面那们仁史,好像我做了,会在delete this时出错,请问一下,是为会么
      

  3.   

    上面那们仁兄,好像我做了,会在delete this时出错,请问一下,是为什么
      

  4.   

    void CCTestDlg::PostNcDestroy() 
    {
    delete this;//出错
    CDialog::PostNcDestroy();
    }
    void CCTestDlg::OnClose() 
    {
    DestroyWindow();
    CDialog::OnCancel();
    }BOOL CCTestDlg::DestroyWindow() 
    {
    return CDialog::DestroyWindow();
    }
      

  5.   

    具体是什么错误?这样处理后就不需要在其它地方再delete了。
      

  6.   

    以下语句换个位置
    void CCTestDlg::OnClose() 

      CDialog::OnCancel();
      DestroyWindow(); 

    另外,如果对话框内有OnTimer定时,如果没必要的,最后请勿调用 CDialog::OnTimer(nIDEvent);
      

  7.   

    非模态对话框不要调用OnCancel、OnOK等函数。
      

  8.   

    我的对话框有RICHEDIT控件,发送框,好像没什么大的错误,但是接收框常驻常驻插入几张图片后,就说内存不足啊(输入文字也会),对话框按道理不会泄露太多内存,我现在是一个对话框就泄7M多,搞不定了
      

  9.   

    非模态对话框为什么不要调用OnCancel、OnOK等函数。
      

  10.   

    或者直接在外部DestroyWindow之后delete CTestPopDlg 
      

  11.   

    对于非模态对话框应该给其父窗体发消息,在消息响应函数里进行delete操作
      

  12.   

    我就是在"给其父窗体发消息,在消息响应函数里进行delete操作"不过还是有啊,不知道是不是RICHEDIT控件的问题
      

  13.   

    CTestPopDlg *pszWindow; 
    pszWindow = new CTestPopDlg;//这里内存泄露 
    不要使用new运算符,当窗口发生WM_DESTROY事件时,窗口就会被Destroy掉,但是这个pszWindow所指向的指针却没有被清理掉,尽管你已经Delete了,但是在内存中,仍然存在着一个pszWindow的拷贝,这是系统生成的。也许就是VC的BUG吧。
      

  14.   

    不用NEW,会出错,请问一下,那要用怎么做?
    因为我相当于像MSN一样,动态建多个窗口的
    ->TearyWang 请说详细点
    谢谢
      

  15.   

    在MFC的内部对象中,很多地方都使用的是对象引用,但是这整个过程本来就是很复杂的,也许一个不小心,少了一个引用符号,就会使用程序中产生一个新的对象。
    这你这里,pszWindow = new CTestPopDlg,每new一次的时候,就会产生一个指向对象的指针,这个指针,指向的是类的数据中成员,而不是函数成员。当你把这个指针加入到生成列表中:list <CTestPopDlg *> m_ChatWindow中,它只将这个指针对应所指向对象的数据部分放入了这个List中,因为函数(或者叫方法)对类来说都是公用的。也就是说,每new一次,再加入List一次,再从List里删除一次。就会产生一个sizeof(CTestPopDlg)-sizeof(CTestPopDlg所有数据成员)大小的内存泄露。除非你在new CTestPopDlg对向的同一个域(可能是一个函数,也可能是一个类)中,直接delete它。我个人的意建是避免动态内存的使用,如果可以的话,尽量使用静态的。
    不知道你现在的具体问题是什么?是不是需要多个这样的对话框同时显示?如果不是,完全可以只有一个,或者多个对话框对象(静态数组)来实现。
      

  16.   

    上面有点没说清楚:
    pszWindow = new CTestPopDlg,这个指针,里是两部分数据,一个是类别信息数据,还有一个类别中的数据信息,
    内存泄露是类另信息的泄漏。
      

  17.   

    昨天我在我的机器上试了一下,你这样用,
    在使用的时候进行定义然后直接创建,接着直接把它加入List<>中。:CTestPopDlg pszWindow;
    pszWindow.Create(IDD_DIALOG1,this->GetDesktopWindow()); 
    pszWindow.ShowWindow(SW_SHOW); 
    m_ChatWindow.push_back(pszWindow); // List<CTestPopDlg &> m_ChatWindow; 
    在CTestPopDlg类中,添加一个自定义消息,并在WM_DESTROY映射中向创建它的主窗口发送这个消息:#define WM_MY_NOTIFY WM_USER+1void CTestPopDlg::OnDestory()
    {
    ::SendMessage(m_hWnd, WM_MY_NOTIFY, NULL, this->GetDlgCtrlID()); // m_hWnd是当前窗口的创建窗口句柄
    }
    在创建这些对话框的窗口中,加入消息调度函数// 在如果你的主窗口是对话框,请在.h中添加第一个,否则添加第二个
    // virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
    // virtual BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult);
    LRESULT 类名::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    {
    // TODO: 在此添加专用代码和/或调用基类
    if ( message == WM_MY_NOTIFY )
    {
    // 从List<>中,将对话框删除
    }

    return CDialog::WindowProc(message, wParam, lParam);
    }BOOL 类名::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
    {
    // TODO: 在此添加专用代码和/或调用基类
    if ( message == WM_MY_NOTIFY )
    {
    // 从List<>中,将对话框删除
    }
    return 父类::OnWndMsg(message, wParam, lParam, pResult);
    }
      

  18.   

    CTestPopDlg pszWindow; 
    pszWindow.Create(IDD_DIALOG1,this->GetDesktopWindow()); 
    pszWindow.ShowWindow(SW_SHOW); 
    m_ChatWindow.push_back(pszWindow); // List<CTestPopDlg &> m_ChatWindow; 如果不用指针,那么,在局部函数处理完,对话框就消失了,而我的对话框要一直出现,直到用户关闭 
    有好的方法解决不?