关于destroy子窗口的内存释放问题 Topic is solved
关于destroy子窗口的内存释放问题
请教wxWidgets的垃圾回收是怎么处理的,把父窗口的子窗口用destroy销毁以后,内存并不能马上释放,而且父窗口占的内存会增加,多次打开销毁子窗口,会导致父窗口占的内存越来越大,有没有办法解决这个问题?
Re: 关于destroy子窗口的内存释放问题
把父窗口的子窗口用destroy销毁以后,内存的确不会马上释放,因为destroy只是将销毁这个窗口的动作放在了一个队列中,等待子窗口的所有事件处理完才会把它销毁。
不过会“多次打开销毁子窗口,导致父窗口占的内存越来越大”这个现象我没有体验过,我有一个程序需要频繁打开销毁子窗口的,并没有出现这个问题。
-Utensil
不过会“多次打开销毁子窗口,导致父窗口占的内存越来越大”这个现象我没有体验过,我有一个程序需要频繁打开销毁子窗口的,并没有出现这个问题。
-Utensil
In fascination of creating worlds by words, and in pursuit of words behind the world.
On Github: http://utensil.github.com
Technical Blog in Chinese: http://utensil.iteye.com/
On Github: http://utensil.github.com
Technical Blog in Chinese: http://utensil.iteye.com/
能告诉我Destroy和Close和Hide有哪些差别么?
能告诉我Destroy和Close和Hide有哪些差别么?
Re: 能告诉我Destroy和Close和Hide有哪些差别么?
如果把这比作辨析题的话,Destroy只需要和delete相区别。swallow wrote:能告诉我Destroy和Close和Hide有哪些差别么?
Close只是发给窗口一个关闭事件,窗口会对这个事件予以处理,你也自己可以处理。但你处理的话,少不得要在处理函数里面调用一次Destroy。
Hide就更远了,只是隐藏窗口,相当于Show(false)。
这些在文档中都给出了详细的辨析,请参见http://docs.wxwidgets.org/stable/wx_wxw ... indowclose
In fascination of creating worlds by words, and in pursuit of words behind the world.
On Github: http://utensil.github.com
Technical Blog in Chinese: http://utensil.iteye.com/
On Github: http://utensil.github.com
Technical Blog in Chinese: http://utensil.iteye.com/
我的界面做得也算复杂的了,但使用正常(也有内存泄漏),没有死机或者速度慢等现象,我使用的是2.8.7版本,我机器配置是Inter双核处理器,1G内存。
http://blog.163.com/kevin_fly/
-----我的博客,我的知识库------
-----我的博客,我的知识库------
不是很能理解为什么楼主会遭遇这样的现象...C++并不依赖垃圾回收,所有的回收都是程序员自己做,除非是代码本身的问题,否则不会出现这种问题的。而就目前使用wxWidgets2.8.7的经历来看,没有发现wxWidgets本身出现这个问题。
如果楼主的源代码行数很多,不妨试着以最少的代码里重新制造出这个现象,然后我们帮楼主分析分析....
-Utensil
如果楼主的源代码行数很多,不妨试着以最少的代码里重新制造出这个现象,然后我们帮楼主分析分析....
-Utensil
In fascination of creating worlds by words, and in pursuit of words behind the world.
On Github: http://utensil.github.com
Technical Blog in Chinese: http://utensil.iteye.com/
On Github: http://utensil.github.com
Technical Blog in Chinese: http://utensil.iteye.com/
我用的VS2005写程序。
打开主窗口打开子窗口
关闭主窗口
关闭子窗口
加载图片和按钮控件
打开主窗口
Code: Select all
dialog5* mainWindow = new dialog5(NULL, ID_DIALOG5, _("dialog5"));
mainWindow->Show();
Code: Select all
void dialog5::OnButton2Click( wxCommandEvent& event )
{
rrr *dlg = new rrr(NULL,ID_DIALOG);
dlg->ShowModal();
dlg->Destroy();
event.Skip();
}
Code: Select all
void dialog5::OnButton1Click( wxCommandEvent& event )
{
Destroy();
event.Skip();
}
Code: Select all
void rrr::click2(wxCommandEvent &event)
{
Destroy();
event.Skip();
}
Code: Select all
void rrr::CreateControls()
{
rrr* itemDialog2 = this;
itemButton1Bmp.LoadFile(_T("pic/11.jpg"), wxBITMAP_TYPE_JPEG);
itemBitmapButton1 = new wxBitmapButton( itemDialog1, ID_BUTTON1, itemButton1Bmp, wxPoint(100,400), wxDefaultSize, wxBUTTON_SHAPED|wxNO_BORDER);
}
Hi, swallow.
推荐一个很好用的东西, 叫Visual Leak Detector的.
带着它, 先在PC下编译, 查查到底是哪漏了, 再做CE的BINARY.
这里有一篇中文的说明.
http://www.testage.net/AutoTest/Opentest/200609/896.htm
推荐一个很好用的东西, 叫Visual Leak Detector的.
带着它, 先在PC下编译, 查查到底是哪漏了, 再做CE的BINARY.
这里有一篇中文的说明.
http://www.testage.net/AutoTest/Opentest/200609/896.htm