【发布时间】:2020-07-27 00:32:54
【问题描述】:
如果我在堆栈上分配 QObjects 以避免内存管理问题,会有什么问题吗?我应该更喜欢动态分配的 QObjects 并通过 qt 对象树及其所有权机制委托内存管理吗?
【问题讨论】:
标签: c++ qt memory-management qobject
如果我在堆栈上分配 QObjects 以避免内存管理问题,会有什么问题吗?我应该更喜欢动态分配的 QObjects 并通过 qt 对象树及其所有权机制委托内存管理吗?
【问题讨论】:
标签: c++ qt memory-management qobject
除非它位于最顶层(例如,在您创建初始窗口时在 main 中),否则您真的不应该这样做。
根本原因是 Qt 根本不是为自动对象设计的。 Qt 是围绕动态分配和为您管理内存而设计的,违反这一点可能会导致一些令人讨厌的结果。立即浮现在脑海的是自动对象的破坏顺序,自动对象的破坏顺序与它们的构造相反。那么在这种情况下会发生什么?
...
QLabel lbl("Hello world");
QWidget win;
lbl.setParent(&win);
...
答案并不漂亮。当这些对象被销毁时,win 将首先被销毁,它会调用lbl 的析构函数,不幸的是lbl 是一个自动对象(这意味着手动删除它是未定义的行为); 在 win 之后它将被正确销毁,但到那时为时已晚。这只是一个示例,但它强调了一些奇怪的错误,如果您违反 Qt 的假设,即它为您管理您的内存,这些错误可能会发生。
总体而言,与自动分配相比,动态内存分配的最小开销是值得的,以防止像上面那样难以追踪和奇怪的错误。 IMO,您应该始终让 Qt 为您管理您的内存,因为这就是它的设计方式,并且它假定您将使用它。
【讨论】: