首页 > 解决方案 > 关于在堆栈上创建 QObjects 组件而不是动态创建它们的利弊

问题描述

如果我在堆栈上分配 QObjects 以避免内存管理问题,是否有任何问题?我应该更喜欢动态分配的 QObjects 并通过 qt 对象树及其所有权机制委托内存管理吗?

标签: c++qtmemory-managementqobject

解决方案


除非它位于最顶层(main例如,在您创建初始窗口时),否则您真的不应该这样做。

基本原因是 Qt 根本不是为自动对象设计的。Qt 是围绕动态分配和为您管理内存而设计的,违反这一点可能会导致一些令人讨厌的结果。立即浮现在脑海的是自动对象的破坏顺序,自动对象的破坏顺序与它们的构造相反。那么在这样的情况下会发生什么呢?

...
QLabel lbl("Hello world");
QWidget win;
lbl.setParent(&win);
...

答案并不漂亮。当这些对象被破坏时,win会先被破坏,并调用 的析构函数lbl,不幸lbl的是它是一个自动对象(这意味着手动删除它是未定义的行为);之后它将被适当地破坏 win但到那时为时已晚。这只是一个示例,但它强调了一些奇怪的错误,如果您违反 Qt 的假设,即它为您管理您的内存,这些错误可能会发生。

总体而言,与自动分配相比,动态内存分配的最小开销是值得的,以防止像上面那样难以追踪和奇怪的错误。IMO,您应该始终让 Qt 为您管理您的内存,因为这就是它的设计方式,并且这就是它假设您将使用它的方式。


推荐阅读