我知道这个问题可能是基于意见的,但是由于我是一名业余程序员,所以我想知道这是否是清理内存的好习惯。
为了清除对象,我使用静态QVector,其中存储指向创建的对象的指针,并创建了一个名为Perfrom_Cleanup的静态函数,该函数从存储在 vector 中的指针中删除所有对象。这是我的代码,以获得更清晰的想法。
头文件
#ifndef AUTOMATIC_CLEANUP_H
#define AUTOMATIC_CLEANUP_H
#include <QObject>
#include <QVector>
#include <QDebug>
class Automatic_Cleanup : public QObject
{
Q_OBJECT
static QVector<Automatic_Cleanup*> m_Objects;
public:
explicit Automatic_Cleanup(QObject *parent = nullptr);
~Automatic_Cleanup();
static void Perfrom_Cleanup();
signals:
public slots:
};
#endif // AUTOMATIC_CLEANUP_H
CPP文件
#include "Automatic_Cleanup.h"
QVector<Automatic_Cleanup*> Automatic_Cleanup::m_Objects;
Automatic_Cleanup::Automatic_Cleanup(QObject *parent) : QObject(parent)
{
m_Objects.append(this);
}
Automatic_Cleanup::~Automatic_Cleanup()
{
qDebug()<<"Deleting object "<<this->objectName();
int i = m_Objects.indexOf(this, 0);
if(i<0)
return;
m_Objects.remove(i);
}
void Automatic_Cleanup::Perfrom_Cleanup()
{
// Deleting from last
for(int i=m_Objects.count()-1; i>=0; i--){
Automatic_Cleanup *obj = m_Objects.at(i);
delete obj;
}
}
我正在从我的主要cpp文件中进行验证
for(int i=0; i<10; i++){
Automatic_Cleanup *obj = new Automatic_Cleanup;
obj->setObjectName(tr("Object %1").arg(i+1));
if(i==4)
delete obj;
}
Automatic_Cleanup::Perfrom_Cleanup();
最佳答案
在Qt中,内存管理是通过父子关系来组织的。
基本上,当您创建任何类型的新QObject
并为其指定一个父参数时,parent将负责删除该对象。
因此,基本上,此静态 vector 已过时,这不是意见。
如果使用父子关系(如果删除根元素),则所有子项将被销毁。
此静态 vector 是一种全局变量,在任何框架或编程语言中均应避免使用此变量。因此,这是不使用它的另一个原因。
关于c++ - 这是清理内存的良好编程习惯吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52514788/