Виталий Антипов
Виталий АнтиповНаурыз 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 вместо указателя.

              Пікірлер

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

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Нәтиже:50ұпай,
              • Бағалау ұпайлары-4
              m
              • molni99
              • Қаз. 26, 2024, 1:37 Т.Ж.

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Нәтиже:80ұпай,
              • Бағалау ұпайлары4
              m
              • molni99
              • Қаз. 26, 2024, 1:29 Т.Ж.

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Нәтиже:20ұпай,
              • Бағалау ұпайлары-10
              Соңғы пікірлер
              ИМ
              Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
              Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
              Evgenii Legotckoi
              Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
              Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
              A
              ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
              Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
              ИМ
              Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
              Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
              d
              dblas5Шілде 5, 2024, 11:02 Т.Ж.
              QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              Енді форумда талқылаңыз
              m
              moogoҚар. 22, 2024, 7:17 Т.Ж.
              Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
              Evgenii Legotckoi
              Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
              добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
              t
              tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
              google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
              NSProject
              NSProjectМаусым 4, 2022, 3:49 Т.Ж.
              Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

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