您的位置:首页 > 编程语言 > Qt开发

关于QT控件的new 与 delete

2010-01-18 16:53 232 查看
http://www.cppblog.com/Wealth/archive/2008/06/04/52128.aspx

关于QT控件的new 与 delete
Qt中,如果申明了两个数组:
QLabel        *label[8];
QLabel        *sLabel[8];

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

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为父对象的;

// 释放控件数据
for(int i=0;i<8;i++)
{
   delete label[i];
  //delete sLabel[i];  // 这一句不需要调用
     // 因为如果在创建组件对象时设置了父对象时,由父对象负责释放其子对象的空间.
}

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

Qt虽然提供了这种机制,自动回收部分的内存,但是自己写程序的时候还是要小心,不要造成内存泄漏.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  delete qt