На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS

Поздравляем всех студентов и Татьян с Татьяниным днём!




msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: archimed7592
  
> Ошибка при очищении памяти динамического элемента динамической структуры. , Qt v.5.3.
    Нужно понять, почему; а также оценить потери памяти. Считать размер структуры 100МБ, массива 16МБ.

    ExpandedWrap disabled
      //Структура и состав.
      struct struct_Data
      {  
          QVector <unsigned long int> *uliGZDC_Square_Points = new QVector <unsigned long int>[iLines_Perimeter_Max*iLines_Perimeter_Max];
      };
       
      //Объявление для других файлов в H_файле.
      extern struct_Data *g_strData_SQL;
      extern struct_Data *g_strData_Edit;
       
      //Создание.
      struct_Data *g_strData_SQL = new struct_Data;
      struct_Data *g_strData_Edit = new struct_Data;
       
      //Выполнение перемещения данных из одной структуры в другую. Эту строку менять нельзя, она нужна именно такая.
      *g_strData_SQL = *g_strData_Edit;
       
      //Подготовка к очищению.
      g_strData_SQL->uliGZDC_Square_Points->resize(0);
          g_strData_Edit->uliGZDC_Square_Points->resize(0);
       
      //Очищение. В каком бы порядке ни были указаны эти 2 строчки - Segmentation Fault всегда возникает на последней. При этом указатель последней строки не NULL.
          delete []g_strData_Edit->uliGZDC_Square_Points; g_strData_Edit->uliGZDC_Square_Points = NULL;
          delete []g_strData_SQL->uliGZDC_Square_Points; g_strData_SQL->uliGZDC_Square_Points = NULL;
      Сергей85, ты пока неправильно понимаешь суть Qt-векторов. Зачем ты запиливаешь динамические массивы? Они тут вообще не упали - все умеет QVector.
      Посмотри пример:
      ExpandedWrap disabled
        #include <QCoreApplication>
        #include <QTimer>
        #include <QVector>
        #include <QDebug>
         
        const int iLines_Perimeter_Max = 100;
         
        struct Struct_Data {
            QVector<QVector<unsigned long int>> Data;
         
            // конструктор: конструируем структуру и резервируем место
            Struct_Data() {
                Data.reserve(iLines_Perimeter_Max * iLines_Perimeter_Max);
            }
         
            // деструктор: чистим перед уничтожением
            ~Struct_Data() {
                // ничего не делаем - этот вектор Data сам очиститься
                qDebug() << "destructor";
            }
         
            //  // можно запилить оператор присваивания структур, но тут и без него можно!
            //  Struct_Data& operator=(const Struct_Data& right) {
            //      if (this != &right) {
            //          Data = right.Data;
            //      }
            //      return *this;
            //  }
         
            // метод тестового заполнения
            void TestFill() {
                Data.push_back({1, 2});
                Data.push_back({3, 4});
                Data.push_back({5, 6});
            }
         
        };
         
        int main(int argc, char *argv[]) {
            QCoreApplication a(argc, argv);
            Struct_Data *One = new Struct_Data;
            Struct_Data *Two = new Struct_Data;
            One->TestFill();
            *Two = *One;
            delete Two;
            delete One;
            QTimer::singleShot(0, &a, SLOT(quit()));
            return a.exec();
        }
        Цитата Majestio @

        Не умеет QVector ни хрена. Уже писал: он лежит в стеке. А в new его принудительно как засунул, так и засунул.

        Добавлено
        "QVector<QVector<unsigned long int>> Data;" - массив размерностью 2?

        "QVector<QVector<QVector<unsigned long int>>> - массив размерностью 3?
          Цитата Сергей85 @
          "QVector<QVector<unsigned long int>> Data;" - массив размерностью 2?

          "QVector<QVector<QVector<unsigned long int>>> - массив размерностью 3?


          Ну не массив, а переменная. Ибо вектор имеет переменную длину. И каждая размерность может меняться. Ну а так, да - размерность два и три. Все верно.

          Добавлено
          Цитата Сергей85 @
          . Уже писал: он лежит в стеке.

          Нет. Куда ты его положишь - там он и ляжет. Другое дело - его внутренний буфер - всегда будет в куче. Посмотри аналогию с QString. Тут будет именно так же.
            Цитата Majestio @

            Я создал QVector стрингов [50][2080][5] примерно.

            Большая размерность не влезает.

            Он не в куче.
              Цитата Сергей85 @
              Он не в куче.

              Покажи весь код, за одно напиши, что хотел сделать.
                Цитата Majestio @


                Нет смысла присылать код. При запуске проекта происходит краш со стрелкой на данном массиве. Он тупо не может быть создан в памяти. Но достаточно поменять числа на меньшие - все работает.

                Сами попробуйте с размерностями [100][360*60][5]. Не создастся.
                  Цитата Сергей85 @
                  Нет смысла присылать код. При запуске проекта происходит краш со стрелкой на данном массиве. Он тупо не может быть создан в памяти. Но достаточно поменять числа на меньшие - все работает.

                  Есть смысл, если есть желание разобраться и найти ошибку.

                  Цитата Сергей85 @
                  Сами попробуйте с размерностями [100][360*60][5]. Не создастся.

                  Немного поменял порядок, на [5][100][360*6], тупо глянуть в отладчике правильность создания. Ну это не важно. Смотри, все нормально работает:

                  ExpandedWrap disabled
                    #include <QCoreApplication>
                    #include <QTimer>
                    #include <QVector>
                    #include <QDebug>
                     
                    int main(int argc, char *argv[]) {
                     
                      size_t Counter = 0;
                      QVector<QVector<QVector<unsigned long int>>> Data;
                     
                        QCoreApplication a(argc, argv);
                        for (auto i = 0; i < 5; i++) {
                         Data.push_back({});
                            for (auto j = 0; j < 100; j++) {
                                Data.last().push_back({});
                                for (auto k = 0; k < 360 * 60; k++) {
                                    Counter++;
                                    Data.last().last().push_back(0);
                                }
                            }
                        }
                     
                        qDebug() << "Total Items: " << Counter;
                        qDebug() << "Total size (without overhead): " << (Counter*sizeof(unsigned long int)/1024/1024) << " Mb";
                        QTimer::singleShot(0, &a, SLOT(quit()));
                        return a.exec();
                    }

                  ExpandedWrap disabled
                    Total Items:  10800000
                    Total size (without overhead):  41  Mb

                  В результате создан трехмерный объект, заполненный (unsigned long int) нулями.

                  Поэтому еще раз повторюсь - не делай громких заявлений, что где-то там кривое дерьмо и все не работает. Ищи примеры в сети, разбирайся.
                  Если ты на первых порах косячишь - это чисто твои проблемы. При должном усердии в изучении все это пройдет.
                    "QVector<QVector<QVector<" - а вот не надо так писать.

                    Напиши как я написал ранее: QVector стрингов [50][2080][5] примерно.. И получишь QVector не в куче. Значит, QVector не всегда в куче.

                    В Этой теме вопрос другой, почему происходит то, что происходит: некорректная очистка структуры. QVector здесь в куче. Удаляется криво только если выполнить этой строки.

                    *g_strData_SQL = *g_strData_Edit;

                    И, похоже, проблема будет с любым объектом new, если к нему применить строку выше.
                      Цитата Сергей85 @
                      "QVector<QVector<QVector<" - а вот не надо так писать.

                      Напиши как я написал ранее: QVector стрингов [50][2080][5] примерно.. И получишь QVector не в куче. Значит, QVector не всегда в куче.

                      :blink: Ну что-тут сказать. Желающий да услышит. Сорян, я пытался ... Умываю руки, делай как знаешь.
                        Цитата Majestio @


                        Мне плевать на Qvector. Перечитай вопрос. Проблема с указателями структуры, а не типами массива или методами его создания.

                        Добавлено
                        И где все остальные участники форума? Призвали что ли? Почему ты здесь один?
                        Сообщение отредактировано: Сергей85 -
                          Цитата Сергей85 @
                          QVector <unsigned long int>

                          Цитата Сергей85 @
                          Не умеет QVector ни хрена

                          Цитата Сергей85 @
                          Напиши как я написал ранее: QVector стрингов [50][2080][5] примерно

                          ...
                          Цитата Сергей85 @
                          Мне плевать на Qvector.

                          Ты меня тролишь? >:(
                            Цитата Сергей85 @
                            Нужно понять, почему; а также оценить потери памяти. Считать размер структуры 100МБ, массива 16МБ.

                            :rolleyes: А если я перепишу попроще?
                            ExpandedWrap disabled
                              struct struct_Data
                              {  
                                  int *q = new int;
                              };
                               
                              struct_Data *q1 = new struct_Data;
                              struct_Data *q2 = new struct_Data;
                               
                              //Выполнение перемещения данных из одной структуры в другую. Эту строку менять нельзя, она нужна именно такая.
                              *q1 = *q2;
                               
                              delete q1;
                              delete q2;
                            Сам ошибку найдёшь?
                            Скрытый текст
                            Утечка памяти в *q1 и удаление удалённого в *q2


                            Добавлено
                            Цитата Сергей85 @
                            "QVector<QVector<QVector<" - а вот не надо так писать.

                            Напиши как я написал ранее: QVector стрингов [50][2080][5] примерно..
                            Мож тебе язык подучить? Русский не помешает тоже, но хотя бы C для начала.
                            ExpandedWrap disabled
                              QVector<QString> blah_blah_blah[50][2080][5];
                            это самый что ни на есть трёхмерный C-массив из мать его 520000 объектов QVector. Каждый по sizeof(QVector) байт. Если каждый из них хотя бы 4 байта, ты скушал на стеке 2Мб.
                              "Утечка памяти в *q1 и удаление удалённого в *q2" - почему именно утечка здесь? Когда я продолжаю работать с этими структурами после такого равенства - они работают как надо, и данные в них до второго по расписанию равенства - индивидуальные. Если я меняю что-то в q1 - меняется именно в q1, q2 остается как есть.

                              "это самый что ни на есть трёхмерный C-массив из мать его 520000 объектов QVector. Каждый по sizeof(QVector) байт. Если каждый из них хотя бы 4 байта, ты скушал на стеке 2Мб. " - зачем мне писать то, что я сам написал в этой теме? Я Маджестио толдычу, что этот массив в стеке - а он со своей кучей пристал.

                              Добавлено
                              Цитата Majestio @


                              Тему перечитай. И забудь про свой QVector. QRizer хоть что-то написал по теме.
                              Сообщение отредактировано: Сергей85 -
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0495 ]   [ 16 queries used ]   [ Generated: 27.01.23, 00:31 GMT ]