Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.224.37.68] |
|
Сообщ.
#1
,
|
|
|
Нужно понять, почему; а также оценить потери памяти. Считать размер структуры 100МБ, массива 16МБ.
//Структура и состав. 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; |
Сообщ.
#2
,
|
|
|
Сергей85, ты пока неправильно понимаешь суть Qt-векторов. Зачем ты запиливаешь динамические массивы? Они тут вообще не упали - все умеет QVector.
Посмотри пример: #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(); } |
Сообщ.
#3
,
|
|
|
Цитата Majestio @ Не умеет QVector ни хрена. Уже писал: он лежит в стеке. А в new его принудительно как засунул, так и засунул. Добавлено "QVector<QVector<unsigned long int>> Data;" - массив размерностью 2? "QVector<QVector<QVector<unsigned long int>>> - массив размерностью 3? |
Сообщ.
#4
,
|
|
|
Цитата Сергей85 @ "QVector<QVector<unsigned long int>> Data;" - массив размерностью 2? "QVector<QVector<QVector<unsigned long int>>> - массив размерностью 3? Ну не массив, а переменная. Ибо вектор имеет переменную длину. И каждая размерность может меняться. Ну а так, да - размерность два и три. Все верно. Добавлено Цитата Сергей85 @ . Уже писал: он лежит в стеке. Нет. Куда ты его положишь - там он и ляжет. Другое дело - его внутренний буфер - всегда будет в куче. Посмотри аналогию с QString. Тут будет именно так же. |
Сообщ.
#5
,
|
|
|
Цитата Majestio @ Я создал QVector стрингов [50][2080][5] примерно. Большая размерность не влезает. Он не в куче. |
Сообщ.
#6
,
|
|
|
Цитата Сергей85 @ Он не в куче. Покажи весь код, за одно напиши, что хотел сделать. |
Сообщ.
#7
,
|
|
|
Цитата Majestio @ Нет смысла присылать код. При запуске проекта происходит краш со стрелкой на данном массиве. Он тупо не может быть создан в памяти. Но достаточно поменять числа на меньшие - все работает. Сами попробуйте с размерностями [100][360*60][5]. Не создастся. |
Сообщ.
#8
,
|
|
|
Цитата Сергей85 @ Нет смысла присылать код. При запуске проекта происходит краш со стрелкой на данном массиве. Он тупо не может быть создан в памяти. Но достаточно поменять числа на меньшие - все работает. Есть смысл, если есть желание разобраться и найти ошибку. Цитата Сергей85 @ Сами попробуйте с размерностями [100][360*60][5]. Не создастся. Немного поменял порядок, на [5][100][360*6], тупо глянуть в отладчике правильность создания. Ну это не важно. Смотри, все нормально работает: #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(); } Total Items: 10800000 Total size (without overhead): 41 Mb В результате создан трехмерный объект, заполненный (unsigned long int) нулями. Поэтому еще раз повторюсь - не делай громких заявлений, что где-то там кривое дерьмо и все не работает. Ищи примеры в сети, разбирайся. Если ты на первых порах косячишь - это чисто твои проблемы. При должном усердии в изучении все это пройдет. |
Сообщ.
#9
,
|
|
|
"QVector<QVector<QVector<" - а вот не надо так писать.
Напиши как я написал ранее: QVector стрингов [50][2080][5] примерно.. И получишь QVector не в куче. Значит, QVector не всегда в куче. В Этой теме вопрос другой, почему происходит то, что происходит: некорректная очистка структуры. QVector здесь в куче. Удаляется криво только если выполнить этой строки. *g_strData_SQL = *g_strData_Edit; И, похоже, проблема будет с любым объектом new, если к нему применить строку выше. |
Сообщ.
#10
,
|
|
|
Цитата Сергей85 @ "QVector<QVector<QVector<" - а вот не надо так писать. Напиши как я написал ранее: QVector стрингов [50][2080][5] примерно.. И получишь QVector не в куче. Значит, QVector не всегда в куче. Ну что-тут сказать. Желающий да услышит. Сорян, я пытался ... Умываю руки, делай как знаешь. |
Сообщ.
#11
,
|
|
|
Цитата Majestio @ Мне плевать на Qvector. Перечитай вопрос. Проблема с указателями структуры, а не типами массива или методами его создания. Добавлено И где все остальные участники форума? Призвали что ли? Почему ты здесь один? |
Сообщ.
#12
,
|
|
|
Цитата Сергей85 @ QVector <unsigned long int> Цитата Сергей85 @ Не умеет QVector ни хрена Цитата Сергей85 @ Напиши как я написал ранее: QVector стрингов [50][2080][5] примерно ... Цитата Сергей85 @ Мне плевать на Qvector. Ты меня тролишь? |
Сообщ.
#13
,
|
|
|
Цитата Сергей85 @ Нужно понять, почему; а также оценить потери памяти. Считать размер структуры 100МБ, массива 16МБ. А если я перепишу попроще? 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 @ Мож тебе язык подучить? Русский не помешает тоже, но хотя бы C для начала."QVector<QVector<QVector<" - а вот не надо так писать. Напиши как я написал ранее: QVector стрингов [50][2080][5] примерно.. QVector<QString> blah_blah_blah[50][2080][5]; |
Сообщ.
#14
,
|
|
|
"Утечка памяти в *q1 и удаление удалённого в *q2" - почему именно утечка здесь? Когда я продолжаю работать с этими структурами после такого равенства - они работают как надо, и данные в них до второго по расписанию равенства - индивидуальные. Если я меняю что-то в q1 - меняется именно в q1, q2 остается как есть.
"это самый что ни на есть трёхмерный C-массив из мать его 520000 объектов QVector. Каждый по sizeof(QVector) байт. Если каждый из них хотя бы 4 байта, ты скушал на стеке 2Мб. " - зачем мне писать то, что я сам написал в этой теме? Я Маджестио толдычу, что этот массив в стеке - а он со своей кучей пристал. Добавлено Цитата Majestio @ Тему перечитай. И забудь про свой QVector. QRizer хоть что-то написал по теме. |