首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

不解于Qt中的new与delete

2012-12-20 
迷惑于Qt中的new与delete举个例子,刚学Qt的例子int main(int argc, char *argv[]){QApplication a(argc, a

迷惑于Qt中的new与delete
举个例子,刚学Qt的例子

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QLabel *label = new QLabel;
    label->show();
    a.exec();

    return 0;
}

这里面的label是new出来的,那么需要delete吗?
我的疑问是,在Qt中什么时候需要delete呢?

[最优解释]
引用:
C/C++ code123456789101112131415    QApplication a(argc, argv);     QLabel *label = new QLabel();     label->show();     a.exec();     delete label;     label= NULL;     return 0;
        ……

就这个例子来讲,根本不需要这样,内存是可控的
[其他解释]
很显然,楼主不是困惑的这里的代码,而是困惑QT里面用的delete太少了。
QT里面使用了QObject来管理子对象。形成了所谓的对象树。只要是QObject的子类,就可以指定一个parent对象,当这个parent销毁的时候,可以自动销毁子对象。所以你在使用QT的时候几乎很少使用手动delete。因为只需要管理parent对象就行了。QT中的例子一般是这样的。(改一下你的代码)

int main(int argc, char *argv[]){ 
   QApplication a(argc, argv);
   QWidget wid; 
   QLabel *label = new QLabel(&wid);  
   wid.show(); 
   a.exec(); 
   return 0;}

因为wid是label的parent,当程序退出的时候wid销毁时,会调用label的析构函数的,所以达到了析构label的目的。
[其他解释]
我之前也一直纠结于这个问题,后来总结了一下,或许有点帮助http://blog.csdn.net/envenler/article/details/8020064
[其他解释]
为什么一定要坚定的寻找delete在哪呢?

main函数结束后进程就销毁了,所有的内存都被操作系统收回了

举个最简单的例子,你要用碎纸机销毁一份文件。在销毁之前你用橡皮把上面的文字一个个的擦掉再扔进碎纸机,和你把文件直接扔进碎纸机效果是一样的。

你会选择那种方式?
[其他解释]

    QApplication a(argc, argv);

    QLabel *label = new QLabel();

    label->show();

    a.exec();

    delete label;

    label= NULL;

    return 0;


[其他解释]
楼主还是要补下C++的东西,尤其是面向对象的思想
[其他解释]
如果代码里不用new 而是直接在生成一个局部变量 
是否就OK了?
那个只是示范代码,app结束后,内存都释放了 不存在泄露
如果做server或长期运行的程序 不停的new 而没有相应的delete 才会出问题
[其他解释]
引用:
楼主还是要补下C++的东西,尤其是面向对象的思想

这与面向对象关系不大,这是操作系统概论的知识
[其他解释]
养成好习惯。 New出来就delete.

Qt里面有个父子关系 。父亲销毁了。同时销毁孩子。 

因为你那个label没有父亲。所以就只有等程序退出的时候才能回收了。
[其他解释]
引用:
引用:楼主还是要补下C++的东西,尤其是面向对象的思想
这与面向对象关系不大,这是操作系统概论的知识


大侠指导的是!
[其他解释]
引用:
引用:楼主还是要补下C++的东西,尤其是面向对象的思想
这与面向对象关系不大,这是操作系统概论的知识


受教了。

当初自学C++的时候,记得看到对象的生存周期以及析构函数时看到new和delete比较多,我也就这么认为了。

关于Qt的内存管理,LZ可以看看这篇博文。
http://devbean.blog.51cto.com/448512/526734
[其他解释]
程序里运行的时候,如果某个方法不断的new的话,那么一定要对应的去delete,否则持续运行下去,肯定会内存溢出的.

热点排行