在QT中自由动态分配内存

时间:2014-09-30 05:18:43

标签: c++ qt

我注意到在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();

}

不需要删除调用或它的位置是错误的?

由于

2 个答案:

答案 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

Object trees and ownership reference here

答案 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!
}

然而,堆栈空间可能比堆空间更有限,因此通常在堆上分配大型结构。