这是清理内存的良好编程习惯吗?

时间:2018-09-26 09:48:34

标签: c++ qt

我知道这个问题可能是基于观点的,但是由于我是一名业余程序员,所以我想知道这是否是清理内存的好方法。
为了清除对象,我使用静态QVector,其中存储指向创建的对象的指针,并创建了一个名为Perfrom_Cleanup的静态函数,该函数从存储在向量中的指针中删除所有对象。这是我的代码,以获得更清晰的想法。

头文件

#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();

2 个答案:

答案 0 :(得分:9)

在Qt中,内存管理是通过父子关系来组织的。 基本上,当您创建任何一种新的QObject并为其指定一个父参数时,parent将负责删除该对象。

因此,基本上,此静态向量已过时,这不是意见。 如果使用父子关系删除根元素,则所有子项都将被破坏。

此静态向量是一种全局变量,应在任何框架或编程语言中避免使用。因此,这是不使用它的另一个原因。

答案 1 :(得分:1)

这种方法有太多缺点,已经提到了许多缺点。

我还要补充一点,您只是在主要功能结束时清理内存(大多数现代操作系统在进程退出 * 时仍会清理内存)。

例如,当您的程序分配了太多对象并且仍然需要更多对象时(例如,假设您编写的服务应运行数周甚至数月),对这种清理的需求就更加迫切了。 )。在这种情况下,您的方法将无济于事。

基本上,您正在实现一个垃圾收集器,该收集器仅在程序即将退出时才启动,并且适用于特定类型的类型。


*请注意,我不鼓励委派从进程到操作系统的任何形式的清理。