迷惑于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呢?
[最优解释]就这个例子来讲,根本不需要这样,内存是可控的
[其他解释]很显然,楼主不是困惑的这里的代码,而是困惑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 才会出问题
[其他解释]这与面向对象关系不大,这是操作系统概论的知识
[其他解释]养成好习惯。 New出来就delete.
Qt里面有个父子关系 。父亲销毁了。同时销毁孩子。
因为你那个label没有父亲。所以就只有等程序退出的时候才能回收了。
[其他解释]大侠指导的是!
[其他解释]受教了。
当初自学C++的时候,记得看到对象的生存周期以及析构函数时看到new和delete比较多,我也就这么认为了。
关于Qt的内存管理,LZ可以看看这篇博文。
http://devbean.blog.51cto.com/448512/526734
[其他解释]程序里运行的时候,如果某个方法不断的new的话,那么一定要对应的去delete,否则持续运行下去,肯定会内存溢出的.