我注意到在QT 5示例中没有分配新小部件的删除调用。
这是否意味着在这个例子中
using namespace std;
#include <QApplication>
#include <QMainWindow>
#include <QTabWidget>
//This is to be used in many files later until the code exits
short * AA = new short[1000000];
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyTabDialog w;
w.show();
delete[] AA;
return app.exec();
}
不需要删除调用或它的位置是错误的?
由于
答案 0 :(得分:2)
如果你真的想在你的代码片段中这样做,你应该在应用程序事件循环结束后放置删除:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyTabDialog w;
w.show();
int result = app.exec();
delete[] AA;
return result;
}
但是为什么要从堆中分配AA?您可以将其定义如下:
short AA[1000000];
在Qt示例中,窗口小部件通常是动态创建的,例如:
QWidget* myWidget = new QWidget(this);
在上面的示例中,this
是指向另一个QObject实例的指针,该实例现在是myWidget
的父实例。现在myWidget
实例将在删除它的父窗口小部件时自动销毁,这就是为什么我们不需要为此实例明确调用delete
。
答案 1 :(得分:0)
在Java中,所有对象变量实际上都是对象引用,有点类似于C ++指针。在C ++中,对象也可以在堆栈上分配(如代码中的MyTabDialog w
)。它不是一个单位化指针(MyTabDialog *w
将是)。它是使用其无参数构造函数创建的初始化对象,并使用其析构函数进行处理。
因此,样本中的变量w
没有删除调用。
同样可以在堆栈上分配而不是删除数组:
int main(int argc, char *argv[])
{
short AA[1000000];
// no delete is required to free AA, beware never to return pointer to it!
}
然而,堆栈空间可能比堆空间更有限,因此通常在堆上分配大型结构。