我有点困惑,不确定该在堆栈上还是堆上初始化主要的小部件。在《C++ GUI Programming with QT 4》中,主要的小部件是在堆栈上初始化的。在我继续之前,让我解释一下我的意思:
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;
}
我提出这个问题的主要原因是我通常喜欢在选择堆和栈时遵循以下模式:
- 如果项目很大 - 堆 - 如果项目长期存在 - 堆 - 否则 - 栈
现在,我的问题归结为两个问题:
1. QWidget是否太大以至于我应该担心堆栈溢出? 2. 平均应用程序的堆栈有多大?除了显然的递归函数之外,什么情况下我应该担心堆栈溢出?
我意识到QWidget本身很少会导致堆栈溢出,但这当然还与应用程序的任何其他堆栈使用相关。
sizeof
查看对象的大小。没有“平均堆栈”,它在应用程序之间变化很大,并且限制在平台之间也有很大的差异。如果您担心,而且由于这个问题很容易跟踪,而且绝对没有性能方面的影响,那就使用堆。 - Matsizeof
是准确的。 - Mat