这里是学习Qt的一些学习记录,主要是一些应该注意的 问题,至少是在我学初级Qt编程时在曾在脑子里浮现的一些问题,记录在这里。供自己查阅,另方便别人。
1. 在栈上用new分配的内存,为什么没有用delete释 放?
从HelloQt说起
#include <qapplication.h>
#include <qlabel.h>
int main( int argc, char **argv )
{
QApplication app( argc, argv );
QLabel *label=new QLabel(“Hello QT!”,0);
app.setMainWidget( label );
label->show();
return a.exec();
}
这里label是new出来的一个指针变量,也就是在栈上申请的内存,在C++语言 里,明确过,在栈上分配的内存是必须认为的用delete释放的,防止内存泄露。这里为什么没有呢。后来看到有的QT程序也有明确使用delete释 放内存的。这里越发不解了。后来,查到原来是QT扩展了C++,如果指针对象有父对象时,可以不用显式释放内存。我们需要显式释放的是那些没有父对象的孤立的指针。但 上面这个例子并没有继承父对象,注意第二个指针,指向父对象的指针参数为0,即没有 父对象,但是setMainWidget把它设为了主窗口部件,它就和程序同步了,当程序退出的时候自动 释放,孩子对象的释放也是如此,在QT中扩展了C++ ,如果父亲对象无效时,子对象自动释放分配的内存。
2. 关于前置声明的说明
前置声明是C++ 的一个特性,不过我是在学QT时才 接触到。这里有一些说明。
#include <qapplication.h>
class QCheckBox;
class myClass:public QDialog
{
Q_OBJECT
public:
--------
signals:
---------
private:
QCheckBox *myCheck;
};
这里定义了一个示例 类,继承于QDialog,其中用Q_OBJECT宏是因为声明的类定义了自己的signals,其中第二行就是一种前置声明,因为私有成员里用到了此类,这种方法 比#include <qcheckbox.h>编 译速度要快,注意私有成员为一个指针,如果是个私有对象而不是指针的话就不能用这种前置声明。具体的理由可以参考C++关于前置声明的说明,这里只是一个提醒