Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在返回按钮或关闭应用程序时调用析构函数?_C++_Qt_Memory Management - Fatal编程技术网

C++ 在返回按钮或关闭应用程序时调用析构函数?

C++ 在返回按钮或关闭应用程序时调用析构函数?,c++,qt,memory-management,C++,Qt,Memory Management,我用Qt构建了一个应用程序。它包括一些屏幕,其中一些屏幕是动态分配的。 我正在考虑是在onBackButton()上删除动态分配的对象,还是只在Maker的析构函数中删除 事情是这样的: 如果在onBackButton()中删除它们,这将节省内存,因为只要不显示屏幕,内存就不会被使用。但是,这意味着如果我们在其中一个屏幕上关闭应用程序,内存将不会被释放 另一方面,如果我们在Maker的析构函数上删除它们,那么当应用程序存在时,内存将被释放。但即使我们不在那个屏幕上,内存仍将被使用(如果我们进入这

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

事情是这样的:

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

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

当然,我们不能在两个位置都删除。这将抛出异常

我选择了第一个选项,因为“关闭(存在)”应用程序的唯一方法是实际按下设备上的电源按钮,这将关闭设备。 所以不会造成伤害-下次我们打开设备时,一切都会好起来的

我的方法正确吗?或者有更好的方法吗?

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

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

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

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


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

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

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

但是更好的方法是使用
QPointer
来保存指针,这样每当删除对象时指针都将为空


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

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

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

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

但是更好的方法是使用
QPointer
来保存指针,这样每当删除对象时指针都将为空


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

我想他说的是在哪里调用delete或deleteLater()函数。因此,他删除对象的方式没有任何区别。因为下一次很可能发生在当前事件循环之后。我想他说的是在哪里调用delete或deleteLater()函数。因此,他删除对象的方式没有任何区别。因为下一次最有可能发生在当前事件循环之后。