Russian Qt Forum
Ноябрь 26, 2024, 13:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы с освобождением памяти  (Прочитано 2436 раз)
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");
вылетает с ошибкой, что не так?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Июль 12, 2011, 09:55 »

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

Qt 5.11/4.8.7 (X11/Win)
goonya
Гость
« Ответ #2 : Июль 12, 2011, 10:04 »

А кто вам разрешил удалять QPluginLoader::instance()?

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

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

Это временная мера, будет написан менеджер плагинов, который будет обрабатывать все плагины в папке и разделять по типу
Записан
ритт
Гость
« Ответ #3 : Июль 12, 2011, 15:49 »

сделать фабрику в плагине и дёргать её createSomething(), а не грузить плагин в каждой итерации и не убивать его наглухо в каждой следующей...
Записан
goonya
Гость
« Ответ #4 : Июль 12, 2011, 16:36 »

Константин, спасибо за совет, буду разбираться с фабриками
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.124 секунд. Запросов: 23.