【问题标题】:free dynamically allocated memory in QT在 QT 中释放动态分配的内存
【发布时间】:2014-09-30 05:18:42
【问题描述】:

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

}

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

谢谢

【问题讨论】:

  • Memory management in Qt? 的可能重复项
  • @MrEricSir 该问题的答案不包括在堆栈中分配的 QObjects,w 就是这种情况。

标签: c++ qt


【解决方案1】:

如果您真的想在您的代码 sn-p 中执行此操作,您应该在应用程序事件循环完成后放置 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 的原因。

Object trees and ownership reference here.

【讨论】:

  • 我想放在堆上,因为需要全局的数组太多,它们的总大小会使堆栈太大
  • @Hatems,似乎当您静态分配变量时(在我的回答中 AA 被定义为全局静态数组),它们肯定不会存储在堆栈中。检查这个答案stackoverflow.com/a/11698458/2266412
  • 感谢您的更新。我同意全局静态变量不在堆栈中。好提醒
【解决方案2】:

在 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!
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2013-04-14
    • 2013-11-22
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多