C++ QT-主窗口小部件-堆栈还是堆?

C++ QT-主窗口小部件-堆栈还是堆?,c++,memory-management,qt4,qwidget,static-memory-allocation,C++,Memory Management,Qt4,Qwidget,Static Memory Allocation,我有点困惑,我是应该在堆栈上还是在堆上初始化我的主要小部件。在“使用Qt4进行C++GUI编程”中,主要小部件在堆栈上初始化。在我说更多之前,我将解释我的意思: int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow mainWin; mainWin.show(); return app.exec(); } 现在,也许这仅仅是因为它更安全,也许是因为他们不想让读者混淆

我有点困惑,我是应该在堆栈上还是在堆上初始化我的主要小部件。在“使用Qt4进行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 vs stack:

  • 如果项目较大-
  • 如果项目是长期-
  • 否则-堆栈
现在,我想我的问题归结为两个问题:

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

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

我更喜欢使用基于堆栈的方法,因为它只提供简短的代码。您对堆栈溢出的担心是有道理的,但这种情况不太可能发生

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


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

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

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

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


堆栈大小通常通过链接器设置进行配置。在Windows上,默认为1MB。

使用
sizeof
查看对象的大小。没有“平均堆栈”,它在不同的应用程序之间差异很大,并且限制因平台而异。如果你担心的话,因为这一个很容易跟踪,而且绝对没有性能方面,那么就使用堆吧。你说它因应用程序而异,我想你指的是使用的堆栈,但是可用的呢。在过去15年中,Windows、Linux或Mac应用程序的最小堆栈大小是多少,而不是每个应用程序的平均值?基本上,如果我正在创建一个跨平台的应用程序,我很好奇我应该期望什么限制sizeof显示为20,这是否准确,这似乎有点小。@Serodis:
sizeof
是准确的。QMainWindow的标准堆栈是这样的。它让读者很清楚地知道,生命中只有一个生命