9

我对是否应该在堆栈或堆上初始化我的主要小部件有点困惑。在“使用 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;
}

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

  • 如果项目很大 -
  • 如果项目是长期的 -
  • 否则 -堆栈

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

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

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

4

2 回答 2

4

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

我认为您不应该担心任何对象都大到足以自行溢出堆栈。虽然可能,但它肯定非常罕见(我还没有见过)。

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

堆栈大小通常通过链接器设置来配置。在 Windows 上,默认情况下为 1MB。

于 2011-12-31T16:02:10.150 回答
2

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

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

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

于 2011-12-31T15:59:33.750 回答