在堆栈上创建 QObjects 组件而不是动态创建它们的优缺点
Pro and cons about creating QObjects components on the stack instead of creating them dynamically
如果我在栈上分配QObjects来避免内存管理问题,会有什么问题吗?我应该更喜欢动态分配的 QObjects 并通过 qt 对象树及其所有权机制委托内存管理吗?
除非它在最顶层(例如在 main
中创建初始 window 时),否则您真的不应该这样做。
根本原因是 Qt 根本就不是为自动对象设计的。 Qt 是围绕动态分配和为您管理内存而设计的,违反这一点可能会导致一些令人讨厌的结果。立即浮现在脑海中的一个是自动对象的销毁顺序,自动对象按照其构建顺序的相反顺序被销毁。那么在这种情况下会发生什么?
...
QLabel lbl("Hello world");
QWidget win;
lbl.setParent(&win);
...
答案并不漂亮。当这些对象被析构时,win
会先被析构,它会调用lbl
的析构函数,不幸的是lbl
是一个自动对象(这意味着手动删除它是未定义的行为);它将在 win
之后被正确销毁,但到那时为时已晚。这只是一个例子,但它突出了一些奇怪的错误,如果您违反 Qt 为您管理内存的假设,这些错误可能会发生。
总的来说,与自动分配相比,动态内存分配的最小开销是值得的,以防止像上面那样难以追踪和奇怪的错误。在我看来,您应该 始终 让 Qt 为您管理您的内存,因为这是它的设计方式,也是它假定您将使用它的方式。
如果我在栈上分配QObjects来避免内存管理问题,会有什么问题吗?我应该更喜欢动态分配的 QObjects 并通过 qt 对象树及其所有权机制委托内存管理吗?
除非它在最顶层(例如在 main
中创建初始 window 时),否则您真的不应该这样做。
根本原因是 Qt 根本就不是为自动对象设计的。 Qt 是围绕动态分配和为您管理内存而设计的,违反这一点可能会导致一些令人讨厌的结果。立即浮现在脑海中的一个是自动对象的销毁顺序,自动对象按照其构建顺序的相反顺序被销毁。那么在这种情况下会发生什么?
...
QLabel lbl("Hello world");
QWidget win;
lbl.setParent(&win);
...
答案并不漂亮。当这些对象被析构时,win
会先被析构,它会调用lbl
的析构函数,不幸的是lbl
是一个自动对象(这意味着手动删除它是未定义的行为);它将在 win
之后被正确销毁,但到那时为时已晚。这只是一个例子,但它突出了一些奇怪的错误,如果您违反 Qt 为您管理内存的假设,这些错误可能会发生。
总的来说,与自动分配相比,动态内存分配的最小开销是值得的,以防止像上面那样难以追踪和奇怪的错误。在我看来,您应该 始终 让 Qt 为您管理您的内存,因为这是它的设计方式,也是它假定您将使用它的方式。