Chinaunix首页 | 论坛 | 博客
  • 博客访问: 10426341
  • 博文数量: 1293
  • 博客积分: 13501
  • 博客等级: 上将
  • 技术积分: 17974
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 18:11
文章分类

全部博文(1293)

文章存档

2019年(1)

2018年(1)

2016年(118)

2015年(257)

2014年(128)

2013年(222)

2012年(229)

2011年(337)

分类: IT业界

2011-06-24 17:08:28

Qt中的new和delete

   Qt中,如果申明了两个数组:

   QLabel        *label[8];
   QLabel        *sLabel[8];

   这两个都是QLabel类型的指针数组,希望在以后的使用中动态的分配其内存;
   那么就应该:
 
   在class MyLabel中...

   for(int i=0;i<8;i++)
   {
       label[i] = new QLabel("This is a Label",this,0);
       //申请空间.   
       sLabel[i] = new QLabel("",label[i],0);
       //第二个Label指针数组的父对象为上面申请过空间的Label.
   }

   QLabel的构造函数的原形为:

   QLabel ( const QString & text, QWidget * parent, const char * name = 0, WFlags f = 0 )

   text:       Label上要显示的字符串;
   parent:     Label的父对象的指针;
   name:       Label的名字;
   f:          Label的Flags;

   从上面的代码容易得知label数组每个元素是以当前MyLabel类对象为父对象的;而sLabel里的元素是以对应的label为父对象的;


  在MyLabel的析构函数中就有相应的释放空间的代码:
 
  for(int i=0;i<8;i++)
  {
       delete label[i];
       //delete sLabel[i];
  }

  这里要是不注释掉上面第3行的语句就会出现段错误,原因经过查找资料得知在Qt中如果在创建组件对象时设置了父对象时,由父对象负责释放其子对象的空间.所以上面第2行已经释放了label的空间,而其子对象的sLabel也随之被释放,所以如果第三行再进行释放就会出现之前所说的错误.

  Qt虽然提供了这种机制,自动回收部分的内存,但是自己写程序的时候还是要小心,不要造成内存泄漏,这对于嵌入式的应用来说更加是件重要的事.毕竟现在的嵌入式硬件还是内存较小,而且要求程序可以长期稳定,高效节能的运行.

阅读(2635) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~