Russian Qt Forum

Qt => Общие вопросы => Тема начата: goonya от Июль 12, 2011, 09:47



Название: Проблемы с освобождением памяти
Отправлено: goonya от Июль 12, 2011, 09:47
Дело в общем то даже не в самой QT а с выгрузкой памяти.

Пищу класс обертку (отдаленно напоминающую QSqlDatabase), в ней есть функция insert, при первом обращении она отрабатывает правильно, но при повторном ее использовании с теми же параметрами вылетает с ошибкой.

data.h
Код:
#ifndef DATA_H
#define DATA_H

...

class Data : public QObject
{
    Q_OBJECT
public:
    ...
    static bool insert(const QString &name, const QString &type);
    ...
private:
    static DataInterface *_currentInterface;
    static QMap<QString, DataInterface *> _interfaceMap;
};

#endif // DATA_H

data.cpp
Код:
...
#include "data.h"
...
bool Data::insert(const QString &type, const QString &name)
{
    QDir pluginsDir(QApplication::applicationDirPath());
    pluginsDir.cd("..");
    pluginsDir.cd("plugins");
    foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
        QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
        if (DataInterface *interface = qobject_cast<DataInterface *>(loader.instance()))
            if (interface->type() == type)
            {
                if (_interfaceMap.contains(name))
                {
                    _currentInterface = _interfaceMap.take(name);
                    delete _currentInterface;
                }
                _currentInterface = interface;
                _interfaceMap.insert(name, interface).value();
                return true;
            }
    }
    _currentInterface = 0;
    return false;
}
...

При выполнении:
Код:
db.insert("SQLite", "default");
db.insert("SQLite", "default");
вылетает с ошибкой, что не так?


Название: Re: Проблемы с освобождением памяти
Отправлено: GreatSnake от Июль 12, 2011, 09:55
А кто вам разрешил удалять QPluginLoader::instance()?
И какой смысл при каждом вызове Data::insert() искать и грузить плагин?


Название: Re: Проблемы с освобождением памяти
Отправлено: goonya от Июль 12, 2011, 10:04
А кто вам разрешил удалять QPluginLoader::instance()?

GreatSnake, а как лучше поступить QPluginLoader::instance()? Может клонировать его для новых подключений при использовании того же DataInterface для нескольких подключений?

И какой смысл при каждом вызове Data::insert() искать и грузить плагин?

Это временная мера, будет написан менеджер плагинов, который будет обрабатывать все плагины в папке и разделять по типу


Название: Re: Проблемы с освобождением памяти
Отправлено: ритт от Июль 12, 2011, 15:49
сделать фабрику в плагине и дёргать её createSomething(), а не грузить плагин в каждой итерации и не убивать его наглухо в каждой следующей...


Название: Re: Проблемы с освобождением памяти
Отправлено: goonya от Июль 12, 2011, 16:36
Константин, спасибо за совет, буду разбираться с фабриками