Это хорошая практика программирования для очистки памяти? - PullRequest
0 голосов
/ 26 сентября 2018

Я знаю, что этот вопрос, вероятно, ориентирован на мнение, но так как я программист-любитель, я хочу знать, является ли это хорошей практикой для очистки памяти.
Для очистки моих объектов я использую статический 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 голосов
/ 26 сентября 2018

У этого подхода слишком много недостатков, многие из них уже упомянуты.

Я хотел бы дополнительно отметить, что вы очищаете свою память только в конце своей основной функции (большинство современных операционных систем).очистка в любом случае, когда ваш процесс завершает работу *).

Более серьезная необходимость в этой очистке возникает при запуске вашей программы, например, когда ваша программа выделила слишком много объектов и все ещенуждается в большем (например, представьте, что вы пишете сервис, который должен работать неделями или месяцами).Ваш подход в этом случае не поможет.

В основном вы реализуете сборщик мусора , который включается только тогда, когда программа собирается завершиться, и работает для определенной иерархии.типов.


* обратите внимание, что я не поощряю делегирование какой-либо формы очистки из процесса в операционную систему.

0 голосов
/ 26 сентября 2018

В Qt управление памятью организовано родительскими и дочерними отношениями.В основном, когда вы создаете новый QObject любого типа и присваиваете ему родительский аргумент, родительский объект будет отвечать за удаление этого объекта.

Таким образом, по сути, этот статический вектор устарел, и это не мнение.Когда используется родительско-дочернее отношение, если вы удаляете корневой элемент, все дочерние элементы будут уничтожены.

Этот статический вектор является своего рода глобальной переменной, и этого следует избегать в любом фреймворке или языке программирования.Так что это еще одна причина не использовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...