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

Call destructor on back button or on closing the application?

本文关键字:应用程序 调用 析构函数 按钮      更新时间:2023-10-16

我使用Qt构建了一个应用程序。它包括一些屏幕,其中一些是动态分配的。我在考虑是在onBackButton()上delete动态分配对象,还是只在它们的制造商的析构函数中。

事情是这样的:

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

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

当然,我们不能在两个位置都使用delete。这将引发异常。

我选择了第一个选项,因为"关闭(存在)"应用程序的唯一方法是物理按下设备上的电源按钮,这将关闭设备。所以没有造成任何伤害——下次我们打开设备时,一切都会好起来的。

我的方法正确吗?或者我能做得更好吗?

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

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

此外,您当然可以删除多个位置的对象,只要您将指针设置为nullptr,这样下次删除就不会引发任何异常。

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

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

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

当控制返回到事件循环时,对象将被删除