详细如下:
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删除对话框指针,
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删除对话框指针,
解决方案 »
- MFC X64平台下的debug调试显示无法启动程序。。。
- 关于通过DLL与服务器进行socket通信的问题.
- 求助!用Gabor卷积进行纹理分析时的Gabor滤波器的参数设定问题
- 怎么把一个CBitmap缩放以后,再放到另一个CBitmap中?
- 怎样关闭多窗口应用程序?
- 如何判别一个窗体是否以打开,不用findwindwo
- 有人可以给我解析一下 GetDlgItem() 使用时,有什么要注意的?窗口指针CWnd* 与 窗口句柄HWND* 有什么分别?
- ie浏览器正常,但纯ie内核浏览器却不能第二次正常看新浪nba直播
- 各位朋友,如有《Visual C++开发经验技巧宝典》光盘代码,请发一份给我,谢谢!
- 大家帮忙这个问题Cannot open include file: 'sys/param.h'
- 如何实现 取消CEdit错误的输入
- 句柄问题
{
delete this;//出错
CDialog::PostNcDestroy();
}
void CCTestDlg::OnClose()
{
DestroyWindow();
CDialog::OnCancel();
}BOOL CCTestDlg::DestroyWindow()
{
return CDialog::DestroyWindow();
}
void CCTestDlg::OnClose()
{
CDialog::OnCancel();
DestroyWindow();
}
另外,如果对话框内有OnTimer定时,如果没必要的,最后请勿调用 CDialog::OnTimer(nIDEvent);
pszWindow = new CTestPopDlg;//这里内存泄露 不要使用new运算符,当窗口发生WM_DESTROY事件时,窗口就会被Destroy掉,但是这个pszWindow所指向的指针却没有被清理掉,尽管你已经Delete了,但是在内存中,仍然存在着一个pszWindow的拷贝,这是系统生成的。也许就是VC的BUG吧。
因为我相当于像MSN一样,动态建多个窗口的
->TearyWang 请说详细点
谢谢
这你这里,pszWindow = new CTestPopDlg,每new一次的时候,就会产生一个指向对象的指针,这个指针,指向的是类的数据中成员,而不是函数成员。当你把这个指针加入到生成列表中:list <CTestPopDlg *> m_ChatWindow中,它只将这个指针对应所指向对象的数据部分放入了这个List中,因为函数(或者叫方法)对类来说都是公用的。也就是说,每new一次,再加入List一次,再从List里删除一次。就会产生一个sizeof(CTestPopDlg)-sizeof(CTestPopDlg所有数据成员)大小的内存泄露。除非你在new CTestPopDlg对向的同一个域(可能是一个函数,也可能是一个类)中,直接delete它。我个人的意建是避免动态内存的使用,如果可以的话,尽量使用静态的。
不知道你现在的具体问题是什么?是不是需要多个这样的对话框同时显示?如果不是,完全可以只有一个,或者多个对话框对象(静态数组)来实现。
pszWindow = new CTestPopDlg,这个指针,里是两部分数据,一个是类别信息数据,还有一个类别中的数据信息,
内存泄露是类另信息的泄漏。
在使用的时候进行定义然后直接创建,接着直接把它加入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);
}
pszWindow.Create(IDD_DIALOG1,this->GetDesktopWindow());
pszWindow.ShowWindow(SW_SHOW);
m_ChatWindow.push_back(pszWindow); // List<CTestPopDlg &> m_ChatWindow; 如果不用指针,那么,在局部函数处理完,对话框就消失了,而我的对话框要一直出现,直到用户关闭
有好的方法解决不?