在QT中释放动态分配的内存

free dynamically allocated memory in QT

本文关键字:内存 动态分配 释放 QT      更新时间:2023-10-16

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

不需要delete调用,或者它的位置错误?

感谢

如果您真的想在代码片段中执行此操作,则应该在应用程序事件循环完成后进行删除:

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

此处为对象树和所有权参考。

在Java中,所有对象变量实际上都是对象引用,有点类似于C++指针。在C++中,对象也可以在堆栈上分配(如代码中的MyTabDialog w)。它不是一个统一的指针(MyTabDialog *w应该是)。它是使用其无参数构造函数创建并使用其析构函数处理的初始化对象。

因此,在您的示例中没有对变量w的delete调用。

分配和不删除堆栈上的数组的方式相同:

int main(int argc, char *argv[])
{
    short AA[1000000];
    // no delete is required to free AA, beware never to return pointer to it!
}

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