Welcome, Guest. Please login or register.
Did you miss your activation email?

Author Topic: Bug: утечка памяти при удалении ReportEngine  (Read 9113 times)

DrGluck

  • Newbie
  • *
  • Posts: 20
    • View Profile
Сценарий прежний: создаётся класс, который создаёт экземпляр ReportEngine и модель. Модель может быть owned или нет, всё равно. Вызываем превью, закрываем, удаляем ReportEngine. После этого регулярно не очищается некоторое количество памяти. На тестовом отчёте в 200 страниц утекает по несколько мегабайт. После пары сотен таких действий получилась картинка (см. аттач).

[вложение удалено администратором]

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Re: Bug: утечка памяти при удалении ReportEngine
« Reply #1 on: February 15, 2016, 03:27:46 pm »
Спасибо. Очень полезная информация. Обязательно гляну.   

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Re: Bug: утечка памяти при удалении ReportEngine
« Reply #2 on: February 15, 2016, 04:47:06 pm »
А что за утилита на скриншоте ?

DrGluck

  • Newbie
  • *
  • Posts: 20
    • View Profile
Re: Bug: утечка памяти при удалении ReportEngine
« Reply #3 on: February 15, 2016, 05:00:09 pm »
Process Hacker, но это не принципиально, можно взять Process Explorer от Руссиновича.

DrGluck

  • Newbie
  • *
  • Posts: 20
    • View Profile
Re: Bug: утечка памяти при удалении ReportEngine
« Reply #4 on: February 15, 2016, 05:52:53 pm »
Ну, собственно, вот:
Code: [Select]
for ( int i = 0; i < 10; i++)
{
    _limeInstance()->previewReport();
}
После previewReport память вообще не очищается, за 20 вызовов доходит до 1ГБ.

[вложение удалено администратором]

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Re: Bug: утечка памяти при удалении ReportEngine
« Reply #5 on: February 16, 2016, 10:34:12 am »
Проблема несвоевременного удаления объектов в previewReport(), имеет место быть и исправляется через изменение деструктора PreviewReportWindow

PreviewReportWindow::~PreviewReportWindow()
{
    if (m_ownedSettings)
        delete m_settings;
    if (m_previewPage)
        delete m_previewPage;
    delete ui;
}

Дальнейшие тесты выдают (см. аттач.)
Тест проводился на следующем коде:

for (int i=0;i<30;++i){
    LimeReport::ReportEngine* re = new LimeReport::ReportEngine();
   
    QSqlQueryModel* customersModel = new QSqlQueryModel();
    customersModel->setQuery("select * from customers", m_db);
    re->dataManager()->addModel("external_customers_data",customersModel,true);
    QSqlQueryModel* ordersModel = new QSqlQueryModel();
    ordersModel->setQuery("Select * from orders",m_db);
    re->dataManager()->addModel("external_orders_data",ordersModel,true);
   
    re->loadFromFile(fileName);
    re->previewReport();
    delete re;
}
Роста потребления не наблюдается.

[вложение удалено администратором]

DrGluck

  • Newbie
  • *
  • Posts: 20
    • View Profile
Re: Bug: утечка памяти при удалении ReportEngine
« Reply #6 on: February 16, 2016, 11:15:54 am »
Сейчас попробуем. Надеюсь в новой версии это уже будет исправлено в самой библиотеке.
Но что делать с падением при попытке удаления открытого отчёта?

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Re: Bug: утечка памяти при удалении ReportEngine
« Reply #7 on: February 16, 2016, 11:23:28 am »
Это дело мы тоже проверим, возможно, это как раз связано с выше приведенной ошибкой. 

DrGluck

  • Newbie
  • *
  • Posts: 20
    • View Profile
Re: Bug: утечка памяти при удалении ReportEngine
« Reply #8 on: February 16, 2016, 11:30:17 am »
И, этсамое, а зачем проверять m_settings и m_previewPag? delete и так прекрасно справляется.
Я понимаю, что это привычка, но уж лучше тогда завести привычку сразу писать
delete _settings;
_settings = nullptr;
даже если кажется, что это не имеет смысла. А то были случаи, когда потом добавился вызов какой-нибудь функции, которая юзала указатель.

DrGluck

  • Newbie
  • *
  • Posts: 20
    • View Profile
Re: Bug: утечка памяти при удалении ReportEngine
« Reply #9 on: February 16, 2016, 01:11:54 pm »
Подтверждаю, не течёт. Во-всяком случае в тестовой программе. Сейчас попробую боевую, там отчёт по 300-400 метров жрёт.

DrGluck

  • Newbie
  • *
  • Posts: 20
    • View Profile
Re: Bug: утечка памяти при удалении ReportEngine
« Reply #10 on: February 17, 2016, 02:51:26 pm »
Дополнение: пустой отчёт, модель не подключена, добавляем Report Header с текстом и запускаем превью 100-200 раз.
У меня память приложения постепенно увеличивается примерно на 5-6 метров. Это, вроде не много, но на отчёте в 500 мегабайт столько утекает иногда на одном запуске.
Проверялось методом "создал репорт, вызвал превью, дождался закрытия, удалил репорт, го то 1".