在后退按钮或关闭应用程序时调用析构函数
Call destructor on back button or on closing the application?
我使用Qt构建了一个应用程序。它包括一些屏幕,其中一些是动态分配的。我在考虑是在onBackButton()上delete
动态分配对象,还是只在它们的制造商的析构函数中。
事情是这样的:
如果它们在onBackButton()中被删除,这将节省内存,因为只要屏幕不显示,内存就不会被使用。但是,这意味着,如果我们在其中一个屏幕上关闭应用程序,内存将不会被释放。
另一方面,如果我们在它们的制造商的析构函数中删除它们,那么当应用程序存在时,内存将被释放。但是,即使我们不在那个屏幕上,内存仍然会被使用(如果我们进入这样的屏幕,然后按下返回键,内存仍会被使用)。
当然,我们不能在两个位置都使用delete
。这将引发异常。
我选择了第一个选项,因为"关闭(存在)"应用程序的唯一方法是物理按下设备上的电源按钮,这将关闭设备。所以没有造成任何伤害——下次我们打开设备时,一切都会好起来的。
我的方法正确吗?或者我能做得更好吗?
好吧,如果你的应用程序是该设备上唯一运行的东西,那么正如你所提到的,在应用程序关闭时,设备会关闭,所以没有问题。
但作为更好的练习,我认为你可以使用Qt的内存清理系统。它的工作原理是这样的,QObject的任何实例都会在自己的删除中删除其所有子QObject。因此,您只需要设置窗口的父级,并将该父级层次结构的顶部设置为QApp实例。通过这种方式,应用程序中的每一个都将被正确地销毁。
此外,您当然可以删除多个位置的对象,只要您将指针设置为nullptr
,这样下次删除就不会引发任何异常。
但更好的方法是使用QPointer
来保存指针,然后每当删除对象时,指针都将为null。
另一种方法可能是使用新的c++11std::shared_ptr
,但您必须发布一些代码来更好地说明您的情况。
对于QObject
(和子类),您可能应该使用(即调用)deleteLater插槽。
当控制返回到事件循环时,对象将被删除
- C# DLL 从C++应用程序调用 SOAP Web 服务
- C++控制台应用程序调用C++/CLI静态库
- 从 C# Windows 应用程序调用 C dll 会导致 svchost.exe 崩溃
- LoadLibray FileNotFound 取决于哪个应用程序调用
- 为什么无法在 Cocoa 应用程序调用的 C++ func 中嵌入自定义 Python 模块
- 从 Qt 小部件应用程序调用 pyqt widget
- 从应用程序调用静态库时,QT创建者什么都不会发生
- numpy.core.multiarray在通过Xcode中开发的C 应用程序调用Python模块时未能导入
- Cython 带 STL 矢量和没有 NumPy 可以从其他应用程序调用,缺少什么?
- 模板化的部分应用程序调用问题
- 从C#.NET应用程序调用C/C 代码
- 一个解决方案,两个项目:如何从 Windows 应用程序调用控制台项目?C++
- 从多线程.net应用程序调用的本机dll中的tbb存在问题
- Qt 5.2 DLL返回与应用程序调用DLL不同的结果
- 从我的c++应用程序调用c#dll(解析XML文件),将数组/列表返回给c++
- 从C++跨平台(OpenKODE)应用程序调用WinRT API
- 如何使用P/Invoke从64位C#应用程序调用64位C++DLL
- 如何从C++桌面应用程序调用UWP API
- 是否可以从本机应用程序调用 Java 代码
- 从 IIS 7.5 Web 应用程序调用 Win32 CreateEvent() 失败