QT -主要部件-堆栈或堆

QT - Main Widget - Stack or Heap?

本文关键字:堆栈 QT      更新时间:2023-10-16

我有点困惑,我应该更喜欢在堆栈上还是在堆上初始化我的主要小部件。在"使用QT 4的c++ GUI编程"中,主要的小部件是在堆栈上初始化的。在我说更多之前,我将解释一下我的意思:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow mainWin;
    mainWin.show();
    return app.exec();
}

现在,也许这仅仅是因为它更安全,也许是因为他们不想让读者对QT中的内存分配感到困惑,删除从QObject继承的对象上的任何删除确实允许读者"忘记"QT对象的内存管理。但是,我的问题是,我们是更喜欢这种方法,还是下面的方法:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow* mainWin = new MainWindow;
    mainWin->show();
    int execReturn = app.exec();
    delete mainWin;
    return execReturn;
}

我提出这个问题的主要原因是我通常更喜欢遵循选择堆与堆栈的模式:

  • 如果项目很大- Heap
  • 如果项目是长期的-
  • 否则- Stack

现在,我想我的问题可以归结为两个问题:

    QWidget是否大到我应该担心堆栈溢出的程度?
  • 平均应用程序的堆栈有多大?什么时候我应该担心堆栈溢出(除了明显的递归函数)?

我意识到QWidget本身不太可能导致堆栈溢出,但当然这将是在我的应用程序可能具有的任何其他堆栈使用之上。

你选择堆vs堆栈的模式听起来很合理,但我不会太担心对象的大小。任何大型对象都应该在内部使用堆。Std::vector通常是三个指针的大小,但也可以非常大。

我认为你不应该担心任何对象大到足以溢出堆栈。虽然这可能是非常罕见的(我还没有见过)。

我也建议考虑简单性,你可以在堆上分配任何局部变量,然后在函数返回之前释放它,但这将是不必要的复杂,通常被认为是不好的做法。

堆栈大小通常通过链接器设置来配置。

我更喜欢使用基于堆栈的方法,因为它只提供简短的代码。您对堆栈溢出的担忧可能是合理的,但它极不可能发生。

虽然我不知道QApplicationMainWindow的大小,但它将(主要)使用堆来处理需要巨大大小的内部数据结构。因此,您不需要太担心潜在的堆栈溢出。

通常,Windows应用程序的堆栈大小为1MB。但是,您可以通过更改链接器选项来轻松更改:/STACK.