Russian Qt Forum

Qt => Базы данных => Тема начата: OKTA от Май 22, 2012, 10:57



Название: QSqlQuery и освобождение памяти
Отправлено: OKTA от Май 22, 2012, 10:57
Товарищи! Приветствую! Подскажите!
Использую запросы через указатели. Запросы проходят как надо, но забивают память!
Как надо о них избавляться, чтобы память освобождалась, когда query и его данные мне не нужны?


Название: Re: QSqlQuery и освобождение памяти
Отправлено: LisandreL от Май 22, 2012, 11:04
delete query; // в том месте, где запрос становится ненужен
Ну это так, не видя код.


Название: Re: QSqlQuery и освобождение памяти
Отправлено: OKTA от Май 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 =(


Название: Re: QSqlQuery и освобождение памяти
Отправлено: sidsukana от Май 22, 2012, 11:45

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

Не может такого быть, значит не запросы забивают память.


Название: Re: QSqlQuery и освобождение памяти
Отправлено: DmitryM от Май 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.


Название: Re: QSqlQuery и освобождение памяти
Отправлено: OKTA от Май 22, 2012, 12:04
Только проблема, что с delete, что без delete утечка идет))) А, и при закрытии проги вылетает в вывод : LEAK: 481 Structure - без понятия что это и откуда)


Название: Re: QSqlQuery и освобождение памяти
Отправлено: DmitryM от Май 22, 2012, 12:07
Только проблема, что с delete, что без delete утечка идет))) А, и при закрытии проги вылетает в вывод : LEAK: 481 Structure - без понятия что это и откуда)
создавай запросы в стеке и не будет утечек.


Название: Re: QSqlQuery и освобождение памяти
Отправлено: OKTA от Май 22, 2012, 12:09
А можно поподробнее чуть-чуть для тех, кто медленно догоняет?))


Название: Re: QSqlQuery и освобождение памяти
Отправлено: Kurles от Май 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 что хотим
   }


Название: Re: QSqlQuery и освобождение памяти
Отправлено: OKTA от Май 22, 2012, 12:36
явное удаление сразу после exec ни к чему не приводит!


Название: Re: QSqlQuery и освобождение памяти
Отправлено: Kurles от Май 22, 2012, 12:46
явное удаление сразу после exec ни к чему не приводит!
Цитировать
Минимальный проект воспроизводящий баг в аттаче повышает шансы на быстрый ответ.
Базу sqlite использовать для простоты в этом проекте.


Название: Re: QSqlQuery и освобождение памяти
Отправлено: DmitryM от Май 22, 2012, 13:03
А можно поподробнее чуть-чуть для тех, кто медленно догоняет?))
не использовать new


Название: Re: QSqlQuery и освобождение памяти
Отправлено: OKTA от Май 22, 2012, 14:35
Да! Спасибо! Проблемы была как раз в new!) Немножко переделал - создаю в классе приватный QSqlQuery, в ф-ии в него кидаю выполненный запрос и возвращаю адрес!


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


Название: Re: QSqlQuery и освобождение памяти
Отправлено: OKTA от Май 22, 2012, 15:38
Ворнингов нет! Забавно то, что теперь все работает как надо, но сыпется миллион QSqlQuery::value: not positioned on a valid record))


Название: Re: QSqlQuery и освобождение памяти
Отправлено: OKTA от Май 22, 2012, 15:56
А нет, не все ок.. ВИдимо из-за неправильно позиционирования теряются данные.


Название: Re: QSqlQuery и освобождение памяти
Отправлено: OKTA от Май 22, 2012, 17:19
Завязал с ссылками - сделал без них. Все ок