crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Постоянно течет память при исполнении скрипта
igor_bogomolov
  опции профиля:
сообщение 6.9.2010, 17:34
Сообщение #1


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Непрерывно течет память при исполнении скрипта. Кто сталкивался с подобным? Может я что то не правильно делаю?
За пример можно взять следующий код

bool Param::scriptEval()
{
    QString sFunction = QString(QLatin1String("function vparam(a,b,c,d,e) { return (e<<16) | a | b | c | d; }"));

    QScriptValue sv = scriptEngine->evaluate(sFunction);
    if (scriptEngine->hasUncaughtException()) {
        qDebug() << tr("Script for param '%1' error: '%2' for '%3'")
                   .arg(m_sName).arg(sv.toString()).arg(sFunction);
        return false;
    }

    QScriptValueList svlArgs;
    svlArgs << 0 << 0 << 0<< 0 << 1;

    QScriptValue fnObj = scriptEngine->globalObject().property(QLatin1String("vparam"));
    QScriptValue fnRes = fnObj.call(QScriptValue(), svlArgs);

    QString sResult = fnRes.toString();
    if (sResult.isEmpty()) {
        qDebug() << tr("Script for param '%1' returns NULL value string: %2")
                .arg(m_sName).arg(sFunction);
        return false;
    }

    qDebug() << sResult.toInt();

    return true;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
igor_bogomolov
  опции профиля:
сообщение 6.9.2010, 22:07
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Переделал немного таким образом
Раскрывающийся текст
#include <QtGui/QApplication>
#include <QtGui/QPushButton>
#include <QtCore/QDebug>
#include <QtScript/QScriptEngine>

class Test : public QObject
{
    Q_OBJECT
public slots:
    void evaluate() {
        for (int i=0; i!=1000;++i) {
            QString sFunction = QString( QLatin1String( "function vparam(a,b,c,d,e) { return (e<<16) | a | b | c | d; }" ) );
            QScriptValue sv = scriptEngine.evaluate( sFunction );
            if( scriptEngine.hasUncaughtException() )
            {
                qDebug() << "Script error";
                return;
            }

            QScriptValueList svlArgs;
            svlArgs << 0 << 0 << 0 << 0 << 1;

            QScriptValue fnObj = scriptEngine.globalObject().property( QLatin1String( "vparam" ) );
            QScriptValue fnRes = fnObj.call( QScriptValue(), svlArgs );

            QString sResult = fnRes.toString();
            if( sResult.isEmpty() )
            {
                qDebug() << "Script error";
                return;
            }

            qDebug() << sResult.toInt();
        }
    }
private:
    QScriptEngine scriptEngine;
};

#include "main.moc"

int main( int argc, char **argv )
{
    QApplication app( argc, argv );
    QPushButton button("text");

    Test test;

    QObject::connect(&button, SIGNAL(clicked()), &test, SLOT(evaluate()));

    button.show();
    return app.exec();
}

Valgrind можно сказать спокоен
"вывод valgrind"
Цитата
==13956== LEAK SUMMARY:
==13956== definitely lost: 124 bytes in 1 blocks
==13956== indirectly lost: 0 bytes in 0 blocks
==13956== possibly lost: 37,731 bytes in 530 blocks
==13956== still reachable: 135,512 bytes in 1,259 blocks
==13956== suppressed: 0 bytes in 0 blocks

Но в диспетчере задач, если нажимать на кнопочку, память постоянно растёт.

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


Возможно диспетчер и плохой инструмент. Но память растёт непрерывно. За несколько дней начинает превышать 500 МБ и "планировщик" эту программу прибивает. Заказчик не доволен, т.к. программа должна работать непрерывно.

Возможно утечки есть и в другом месте. Сбивает то, что если я комментирую scriptEngine->evaluate утечки прекращаются.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.4.2024, 2:24