在后退按钮或关闭应用程序时调用析构函数?

时间:2015-12-27 08:31:51

标签: c++ qt memory-management

我使用Qt构建了一个应用程序。它包括一些屏幕,其中一些是动态分配的。 我正在考虑是否{i}动态分配onBackButton()上的对象,或仅仅是在他们的制作者中。析构函数。

这就是事情:

如果它们在onBackButton()中被删除,这将节省内存,因为只要屏幕没有显示,就不会使用内存。但是,这意味着如果我们在其中一个屏幕中关闭应用程序,则内存将无法解除分配。

另一方面,如果我们删除他们的制造商'析构函数,当应用程序存在时,内存将被释放。但是即使我们不在该屏幕中,仍然会使用内存(如果我们进入这样的屏幕,然后按回来,仍会使用内存)。

当然,我们无法delete在这两个地方。这将抛出异常。

我选择了第一个选项,因为只有这样才能关闭(存在)"该应用程序是通过物理按下设备上的电源按钮 - 这将关闭设备。 所以没有伤害 - 下次我们打开设备一切都会好的。

我的方法是正确的还是我能做得更好?

2 个答案:

答案 0 :(得分:3)

好吧,如果您的应用程序是该设备上唯一运行的应用程序,那么正如您所提到的,在应用程序关闭时,设备将关闭,所以没问题。

但作为一种更好的做法,我认为你可以使用Qt的内存清理系统。它的工作原理是QObject的任何实例都会删除它自己删除的所有子QObject。因此,您只需要设置Windows的父级,并将此父级层次结构的顶部设置为QApp实例。这种方式在应用程序中,它们中的每一个都将被正确销毁。

此外,您可以在多个位置删除对象,只要将指针设置为nullptr,以便下一次删除不会引发任何异常。

但更好的方法是使用QPointer来保存指针,然后每当删除对象时它都为null。

另一种方法可能是使用新的c ++ 11 std::shared_ptr,但你必须发布一些代码来更好地说明你的情况。

答案 1 :(得分:1)

对于QObject(和子类),您可能应该使用(即调用)deleteLater槽。

  

当控件返回到事件循环

时,将删除该对象