Fox Toolkit应用程序内存出错浅析

今天用Fox Toolkit编写了一个小Demo程序,但在程序运行结束时,总会出现内存出错的提示。其部分代码如下:


TestWindow::TestWindow(FXApp* a):FXMainWindow(a,"Test Window",NULL,NULL,DECOR_ALL,0,0,800,600)
{
  // Menu bar
  menubar=new FXMenuBar(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X);
  // File menu
  filemenu=new FXMenuPane(this);
  new FXMenuCommand(filemenu,"Quit/tCtl-Q",NULL,getApp(),FXApp::ID_QUIT);
  new FXMenuTitle(menubar,"&File",NULL,filemenu);
  // Status bar
  status=new FXStatusBar(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|STATUSBAR_WITH_DRAGCORNER);
  // Main window
  contents=new FXVerticalFrame(
                               this,
                               LAYOUT_SIDE_TOP|FRAME_NONE|LAYOUT_FILL_X|LAYOUT_FILL_Y);
  leftFrame=new FXVerticalFrame(
                               contents,
                               FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_LEFT,
                               0,0,0,0,10,10,10,10);
  .......
}


TestWindow::~TestWindow(){
  delete filemenu;
  delete menubar;
  delete contents;     /*注意这里的顺序是错误的*/
  delete leftFrame;
}

之所以出现内存出错,是因为TestWindow类的析构函数中各组件的释放顺序。上述代码中,leftFrame是依据contents建立的,即leftFrame是在contents容器中。因此,当delete contents后,再delete leftFrame就会因为找不到contents而出现内存出错的提示,delete不成功。

了解了原因之后,只需将这里的delete顺序更改一下即可,先delete leftFrame再delete contents。如果contents容器中同样存在其他组件,则必须先将这些组件delete完后,才可delete contents。其他容器的释放顺序也需按照这一规则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值