Виталий Антипов
Виталий АнтиповНаурыз 17, 2018, 1:58 Т.Қ.

Вопросы по использованию памяти

Добрый день! Столкнулся с проблемой резкого роста потребления памяти программой и пытаюсь в этом разобраться. Представим пример:

int main(int argc, char *argv[])
{
...
QObject* root = engine.rootObjects()[0];
ListModel *model = new ListModel();
DataMapper *mapper = new DataMapper();
QObject::connect(root, SIGNAL(qmlSignal()), model, SLOT(updateModel()));
mapper->setModel(model);
engine.rootContext()->setContextProperty("mapper", mapper);
...
}
Вызываемый слот:
void ListModel::updateModel()
{
    QObject* stack = this->parent()->findChild<QObject*>("stackView");
    QString name=(stack->property("name")).toString();
    this->setQuery(" SELECT Base.id, Base.Company, Base.Number FROM Base WHERE Base.Name = " + name );
}
Абстрактный main.qml:
ApplicationWindow {
    id: window
    siqnal qmlSignal()
    StackView {
       id: stackView
       objectName: "stackView"
       property string name: "Leonid"
           Component.onCompleted: {
               stackView.push(window1) //стартовое окно
               }
       Component {
            id: window1
            Window1{
                id: window1_
            }
        }
        Component {
            id: window2
            Window2 {
                id: window2_
            }
        }
}
}
В начальном окне Window1:
Item {
   ...
   Button {
   ...
   onClicked: stackView.replace(window2)
   }
}
Окно отображения данных Window2:
Item {
   ...
Component.onComplited {
   qmlSignal()
   mapper.addMapping(text_company, (0x0100+2), "text")
   mapper.addMapping(text_number, (0x0100+3), "text")
   }
Button {
onClicked: stackView.replace(window2) } }
То есть в интерфейсе грузимся с каким-то Window1, на котром кнопочка, по нажатию на которую Window1 заменяется на Window2, при загрузке которого отправляется сигнал на отработку функции updateModel(). В результате получаем модель model, на основе которой получится mapper из которого забираем данные в какие-то дочерние элементы Window2.
Теперь нажмем на кнопку в Window2 - произойдет замена этого компонента StackView на Window1. Я вот почему-то думал, что родителем для mapper и model является window2 - ведь в нем они вызываются. Но при уничтожении window2 они остаются жить. В чем я не прав? И второй вопрос... в реальном проекте в mapper передается модель с 33 значениями, но при вызове mapper.addMapping() потребление оперативки растет на сотни мегабайт и приложение падает. От чего зависит размер выделяемой памяти в куче?
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

6
Виталий Антипов
  • Наурыз 17, 2018, 5:16 Т.Қ.
  • (өңделген)

Это какая-то жесть. Вместо model и mapper данные записал в QStringList и передал в интерфейс. Аналогично память начала расти скачками 100 Мб->155 Мб->215 Мб->285 Мб->302 Мб и словил

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
terminate called recursively
Программа неожиданно завершилась.
С model и mapper было то же самое. Думал что проблема с динамическим выделением памяти, ан нет...
    Evgenii Legotckoi
    • Наурыз 17, 2018, 5:21 Т.Қ.

    Добрый день!
    У модели и маппера изначально вообще нет родителя. Вы же не передаёте указатель на родителя, когда выделяете память в куче. А то, что окно имеет доступ к ним, так это лишь благодаря тому, что Вы зарегистрировали их в качестве контекста в QML движке. Полагаю, что в данном случае никаких прав родительствования у этих объектов вообще не изменяется. А объект Window2 или Window1 не являются для них порождающими, поэтому и не могут быть родителями.


    А вот, что касается addMapping(), то там по ходу утечка памяти где-то... на сотни мегабайт возрастания не должно быть. Либо утечка памяти, либо зацикливание. Запустите в дебагере и посмотрите, где упадёт. Вполне возможно, что в C++ части падать будет.
      Evgenii Legotckoi
      • Наурыз 17, 2018, 5:29 Т.Қ.

      А какую версию Qt сейчас используете?

        Виталий Антипов
        • Наурыз 17, 2018, 6:13 Т.Қ.

        Qt 5.10.1.

          Виталий Антипов
          • Наурыз 17, 2018, 8:39 Т.Қ.

          Дебагер не помогает. Пишет неизвестный процесс остановил программу. А сейчас выдало:

          Out of memory  in scenegraph\coreapi\qsggeometry.cpp, line 678
          terminate called without an active exception
          Out of memory  in c:\Users\qt\work\install\include/QtCore/qvector.h, line 552
          terminate called recursively
          terminate called recursively
          Но у меня нет такой папки c:\Users\qt.
          В релиз сборке приложение не падает.
          Все-таки нашел источник проблемы. Я в интерфейс накидал много огромных моделей данных, но если их заранее уменьшить то проблем нет.
          И все-таки хотелось бы вернуться к первому вопросу. Если модель и маппер не имеют родителя, то какой смысл им выделять динамическую память? ведь после вызова они будут жить до конца жизни программы и весь смысл в куче пропадает.
            Evgenii Legotckoi
            • Наурыз 18, 2018, 8:46 Т.Ж.

            Можете не выделять )) Я тогда просто не очень обратил внимание на этот нюанс. Конкретно в данном случае, можно создать в стеке и передать ссылку в setContextProperty вместо указателя.

              Пікірлер

              Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
              Кіріңіз немесе Тіркеліңіз
              Г

              C++ - Тест 001. Первая программа и типы данных

              • Нәтиже:66ұпай,
              • Бағалау ұпайлары-1
              t

              C++ - Тест 001. Первая программа и типы данных

              • Нәтиже:33ұпай,
              • Бағалау ұпайлары-10
              t

              Qt - Тест 001. Сигналы и слоты

              • Нәтиже:52ұпай,
              • Бағалау ұпайлары-4
              Соңғы пікірлер
              G
              GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
              Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
              d
              dblas5Шілде 5, 2024, 11:02 Т.Ж.
              QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              k
              kmssrАқп. 8, 2024, 6:43 Т.Қ.
              Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
              АК
              Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
              Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
              Енді форумда талқылаңыз
              Evgenii Legotckoi
              Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
              F
              FynjyШілде 22, 2024, 4:15 Т.Ж.
              при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
              BlinCT
              BlinCTМаусым 25, 2024, 1 Т.Ж.
              Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
              BlinCT
              BlinCTМамыр 5, 2024, 5:46 Т.Ж.
              Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
              Evgenii Legotckoi
              Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
              Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

              Бізді әлеуметтік желілерде бақылаңыз