QT -主要部件-堆栈或堆
QT - Main Widget - Stack or Heap?
我有点困惑,我应该更喜欢在堆栈上还是在堆上初始化我的主要小部件。在"使用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通常是三个指针的大小,但也可以非常大。
我认为你不应该担心任何对象大到足以溢出堆栈。虽然这可能是非常罕见的(我还没有见过)。
我也建议考虑简单性,你可以在堆上分配任何局部变量,然后在函数返回之前释放它,但这将是不必要的复杂,通常被认为是不好的做法。
堆栈大小通常通过链接器设置来配置。
我更喜欢使用基于堆栈的方法,因为它只提供简短的代码。您对堆栈溢出的担忧可能是合理的,但它极不可能发生。
虽然我不知道QApplication
和MainWindow
的大小,但它将(主要)使用堆来处理需要巨大大小的内部数据结构。因此,您不需要太担心潜在的堆栈溢出。
通常,Windows应用程序的堆栈大小为1MB。但是,您可以通过更改链接器选项来轻松更改:/STACK.
相关文章:
- Qt VTK交互风格的信号到小部件
- QT在错误的班级中寻找空位
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- Qt 5.9中的QML崩溃-帮助读取堆栈跟踪
- 增加 QT 中的堆栈大小
- QT应用程序崩溃但不容易复制,我捕获了转储堆栈以及如何通过堆栈找到源代码
- 未初始化的值是由堆栈分配 - Qt - C++创建的
- Qt - 堆栈上具有父级的 QObject 如何被删除两次?
- 用GCC 4.6.2 C QT设置堆栈大小,Mingw,Vista
- 无法序列化和反序列化 Qt/C++ 中的字符串堆栈
- 将链接放到QMainWindow时的Qt浏览器堆栈
- QT -主要部件-堆栈或堆
- 在qt中更改不同堆栈小部件页面中的菜单栏内容
- 如何设置Qt使用blueZ蓝牙堆栈
- 堆栈对象Qt信号和参数作为参考
- linux上的Qt应用程序如何崩溃,堆栈中没有我的代码(只有Qt代码和std库)
- 如何防止QT事件堆栈溢出
- Qt如何处理堆栈分配的对象
- 如何在Qt中增加线程的堆栈大小- QThread::setStackSize()似乎不起作用