我使用Qt构建了一个应用程序。它包括一些屏幕,其中一些是动态分配的。 我正在考虑是否{i}动态分配onBackButton()上的对象,或仅仅是在他们的制作者中。析构函数。
这就是事情:
如果它们在onBackButton()中被删除,这将节省内存,因为只要屏幕没有显示,就不会使用内存。但是,这意味着如果我们在其中一个屏幕中关闭应用程序,则内存将无法解除分配。
另一方面,如果我们删除他们的制造商'析构函数,当应用程序存在时,内存将被释放。但是即使我们不在该屏幕中,仍然会使用内存(如果我们进入这样的屏幕,然后按回来,仍会使用内存)。
当然,我们无法delete
在这两个地方。这将抛出异常。
我选择了第一个选项,因为只有这样才能关闭(存在)"该应用程序是通过物理按下设备上的电源按钮 - 这将关闭设备。 所以没有伤害 - 下次我们打开设备一切都会好的。
我的方法是正确的还是我能做得更好?
答案 0 :(得分:3)
好吧,如果您的应用程序是该设备上唯一运行的应用程序,那么正如您所提到的,在应用程序关闭时,设备将关闭,所以没问题。
但作为一种更好的做法,我认为你可以使用Qt的内存清理系统。它的工作原理是QObject的任何实例都会删除它自己删除的所有子QObject。因此,您只需要设置Windows的父级,并将此父级层次结构的顶部设置为QApp实例。这种方式在应用程序中,它们中的每一个都将被正确销毁。
此外,您可以在多个位置删除对象,只要将指针设置为nullptr
,以便下一次删除不会引发任何异常。
但更好的方法是使用QPointer
来保存指针,然后每当删除对象时它都为null。
另一种方法可能是使用新的c ++ 11 std::shared_ptr
,但你必须发布一些代码来更好地说明你的情况。
答案 1 :(得分:1)
对于QObject
(和子类),您可能应该使用(即调用)deleteLater槽。
当控件返回到事件循环
时,将删除该对象