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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QSqlQuery и освобождение памяти  (Прочитано 9009 раз)
OKTA
Гость
« : Май 22, 2012, 10:57 »

Товарищи! Приветствую! Подскажите!
Использую запросы через указатели. Запросы проходят как надо, но забивают память!
Как надо о них избавляться, чтобы память освобождалась, когда query и его данные мне не нужны?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Май 22, 2012, 11:04 »

delete query; // в том месте, где запрос становится ненужен
Ну это так, не видя код.
Записан
OKTA
Гость
« Ответ #2 : Май 22, 2012, 11:27 »

Вот такая штука присутствует в одном классе.
Код:
QSQ *uDataBase::query(const QString &sql, bool inMainDB){

    QString conn;

    // выбираем БД
    if (inMainDB)
        conn = connection;
    else
        conn = memConn;

    QSqlQuery *q = new QSQ::QSqlQuery(sql, QSqlDatabase::database(conn));

    if (sql.contains("SELECT", Qt::CaseInsensitive))
        q->exec();

    return q;
}

Возвращается в другой класс она посредством

Код:
QSQ *query(const QString& sql, bool inMainDB = false){
        //

        return db->query(sql, inMainDB);
    }

ну и используется примерно вот так в основном теле:
Код:
QSQ *query = query("SELECT * FROM tablename WHERE ident = '28' ");

delete query не помогает, не помогают и finish И clear =(
Записан
sidsukana
Гость
« Ответ #3 : Май 22, 2012, 11:45 »


delete query не помогает

Не может такого быть, значит не запросы забивают память.
Записан
DmitryM
Гость
« Ответ #4 : Май 22, 2012, 12:00 »


delete query не помогает

Не может такого быть, значит не запросы забивают память.
Может  Подмигивающий
Если внимательно читать асситент по работе с БД, то можно увидеть
Цитировать
Warning: There should be no open queries on the database connection when this function is called, otherwise a resource leak will occur.
Записан
OKTA
Гость
« Ответ #5 : Май 22, 2012, 12:04 »

Только проблема, что с delete, что без delete утечка идет))) А, и при закрытии проги вылетает в вывод : LEAK: 481 Structure - без понятия что это и откуда)
Записан
DmitryM
Гость
« Ответ #6 : Май 22, 2012, 12:07 »

Только проблема, что с delete, что без delete утечка идет))) А, и при закрытии проги вылетает в вывод : LEAK: 481 Structure - без понятия что это и откуда)
создавай запросы в стеке и не будет утечек.
Записан
OKTA
Гость
« Ответ #7 : Май 22, 2012, 12:09 »

А можно поподробнее чуть-чуть для тех, кто медленно догоняет?))
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #8 : Май 22, 2012, 12:31 »

я для получения QSqlQuery нужного мне соединения использовал бы такой код:

Код
C++ (Qt)
bool SqlExtension::getSqlQuery(QSqlQuery &q, bool inMainDB)
{
   QString dbConnectionString;
   inMainDB ? dbConnectionString = "mainDBConnectionString" : dbConnectionString = "nonMainDBConnectionString";
   QSqlDatabase db = QSqlDatabase::database(dbConnectionString, false);
   q = QSqlQuery(db);
   return db.isOpen();
}
 
использование:
Код
C++ (Qt)
   QSqlQuery q;
   if (!db->getSqlQuery(q, true))
   {
       //.. нужное нам соединение отсутствует
   } else
   {
       // .. творим с полученым QSqlQuery что хотим
   }
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
OKTA
Гость
« Ответ #9 : Май 22, 2012, 12:36 »

явное удаление сразу после exec ни к чему не приводит!
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #10 : Май 22, 2012, 12:46 »

явное удаление сразу после exec ни к чему не приводит!
Цитировать
Минимальный проект воспроизводящий баг в аттаче повышает шансы на быстрый ответ.
Базу sqlite использовать для простоты в этом проекте.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
DmitryM
Гость
« Ответ #11 : Май 22, 2012, 13:03 »

А можно поподробнее чуть-чуть для тех, кто медленно догоняет?))
не использовать new
Записан
OKTA
Гость
« Ответ #12 : Май 22, 2012, 14:35 »

Да! Спасибо! Проблемы была как раз в new!) Немножко переделал - создаю в классе приватный QSqlQuery, в ф-ии в него кидаю выполненный запрос и возвращаю адрес!
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #13 : Май 22, 2012, 14:40 »

Да! Спасибо! Проблемы была как раз в new!) Немножко переделал - создаю в классе приватный QSqlQuery, в ф-ии в него кидаю выполненный запрос и возвращаю адрес!
А он тебе ворнинги в консоль не кидает, когда ты класс уничтожаешь, в котором находиться этот самый приватный QSqlQuery?
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
OKTA
Гость
« Ответ #14 : Май 22, 2012, 15:38 »

Ворнингов нет! Забавно то, что теперь все работает как надо, но сыпется миллион QSqlQuery::value: not positioned on a valid record))
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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