Russian Qt Forum
Ноябрь 26, 2024, 08:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Выделение памяти под структуру  (Прочитано 10658 раз)
Waryable
Гость
« : Сентябрь 24, 2009, 05:15 »

Код
C++ (Qt)
struct
{
     int iVar;
     double dVar;
     QList<int> listVar;  // исправил опечатку. было lVar1
     int iVar1;
}Test;
Имеем такую структуру чисто как пример для разбора.
Раньше я как то не задумывался над этой проблемой, но тут понадобилось сделать надежный код и появился данный вопрос: как происходит работа с памятью для данной структуры во время исполнения? Ведь на сколько я знаю под структуру выделяется некоторый участок памяти, который сегментирован неким образом(выравнивание полей по умолчанию), но все равно является неким цельным участком. Если во время исполнения пихнуть в listVar одпустим 1000 элементов, то мне не совсем понятно куда эти элементы помещяются в памяти.
Отсюда просьба - может кто знает где доходчиво объясняется данный момент, киньте ссыль или просто название дока - порою в нете. А может и на пальцах можно объяснить.
« Последнее редактирование: Сентябрь 24, 2009, 10:48 от Waryable » Записан
fuCtor
Гость
« Ответ #1 : Сентябрь 24, 2009, 06:56 »

В память где находится lVarl будут помещены разные виртуальные таблицы и другая информация необходимая для работы класса, в том числе различные параметры. А вот элементы добавляемые в этот список будут уже укладываться куда угодно в памяти, где под них выделится новое место.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #2 : Сентябрь 24, 2009, 14:53 »

они в куче создаются
Записан
MoPDoBoPoT
Гость
« Ответ #3 : Сентябрь 24, 2009, 18:42 »

Память под элементы списка выделяется динамически (забирается из кучи). QList - это шаблонный класс, использующий односвязный список. Почитай про списки и иже с ними (чуток из википедии)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Сентябрь 24, 2009, 19:06 »

QList - это шаблонный класс, использующий односвязный список. Почитай про списки и иже с ними (чуток из википедии)
Поправьте меня если нужно, но QList не есть связный список (т.е. элемент QList не содержит никаких указателей на следующий или предыдущий элементы) и имеет мало общего с std::list. Как я понял, QList - это просто массив указателей на объекты который может расти с головы или с хвоста. Для малых данных хранятся сами данные вместо указателей. В букваре правильно написано что QList - самый популярный контейнер.
Записан
Waryable
Гость
« Ответ #5 : Сентябрь 25, 2009, 05:09 »

Так. Получается, что в структуру компилятор пихает указатель на область памяти в куче?

MoPDoBoPoT, умные книги про Макса Шлее и Жасмин Бланшет пишут, что QList - не связный список, а контейнер, элементы которого расположены в памяти последовательно. Предвидя возможный ответ, что контейнер содержит ссылки на элементы в "рандомных областях кучи" говорю, что сами указатели тоже надо хранить в памяти, причем последовательно.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Сентябрь 25, 2009, 11:13 »

умные книги про Макса Шлее и Жасмин Бланшет пишут, что ..
Есть еще более умная книга - исходники  Улыбающийся

Структура/класс не может "расти" или "уменьшаться", ее размер фиксирован при компиляции и известен через sizeof. Расти может блок(и) памяти которым контейнеры управляют и хранят указатель на него (часто еще через несколько указателей)
Записан
Waryable
Гость
« Ответ #7 : Сентябрь 27, 2009, 08:24 »

Всем спс за участие. Теперь я почти спокоен.  Улыбающийся
Записан
ритт
Гость
« Ответ #8 : Сентябрь 28, 2009, 18:48 »

озадачивает это "почти" Улыбающийся

но с другой стороны, лучше уж, действительно, единожды пройтись скрупулёзно по интересующей проблеме и сделать практические выводы /* нежели огрести кучу АСЕ, когда проект уже будет запущен :Р */
Записан
Waryable
Гость
« Ответ #9 : Октябрь 08, 2009, 04:31 »

озадачивает это "почти" Улыбающийся

но с другой стороны, лучше уж, действительно, единожды пройтись скрупулёзно по интересующей проблеме и сделать практические выводы /* нежели огрести кучу АСЕ, когда проект уже будет запущен :Р */
Я действительно немного поигрался с памятью под QList. После тестирования модуля втечение пары дней проблем не возникло. Утечек нет, а я боялся, честно говоря, по этому поводу. Ибо, для меня не очевидны действия компилятора по обеспечению очистки памяти по адресам, хранящимся в контейнере во время исполнения. Вобщем, контейнер(а точнее его деструктор) походу сам заботится об уничтожении данных по адресам-элементам при удалении объекта контейнера.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #10 : Октябрь 08, 2009, 10:28 »

Если контейнер объявлен как QList<int>, то да, он будет заботиться об очистке. А если как QList<int *> - то увы нет. Этим должен заниматься программист.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Waryable
Гость
« Ответ #11 : Октябрь 08, 2009, 12:04 »

Во даю!!! Надо в отпуск срочно. Использовал версию проекта с ручной очисткой целых два дня, честно полагая что это версия без ручной работы. Вот до чего доводит лень... и нехватка времени!  Непонимающий  Улыбающийся
А стоило сделать примерчик на пару десятков строчек:
Код
C++ (Qt)
typedef struct
{
int ii;
double dd;
 
} iidd;
 
void test::runMem()
{
for ( int i = 0; i < 1000; i++ )
{
QList<iidd*> lQue;
for ( int j = 0; j < 1000; j++ )
{
iidd* que = new iidd;
lQue.append(que);
}
/*
for ( int k = 0; k < 10000; k++ )
delete lQue.at(k);
*/

}
}
И понял я, что это такое утечка через QList. Эта зараза на корке E8400 за 10 сек почти 100 метров съела.
Как говорится: одна голова хорошо, а другая подскажет где ты не прав  Подмигивающий
pastor`у отдельное спс.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #12 : Октябрь 08, 2009, 12:30 »

По поводу освобождения памяти:

Код
C++ (Qt)
while (!list.isEmpty())
    delete list.takeFirst();

или:

 
Код
C++ (Qt)
qDeleteAll(list);
list.clear();
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Waryable
Гость
« Ответ #13 : Октябрь 09, 2009, 04:20 »

Хм. Ну я опять чуток ошибся. В закомментированном блоке должно было быть конечно же:
Код
C++ (Qt)
for ( int k = 0; k < lQue.count(); k++ )
        delete lQue.at(k);
В этом виде мой и твои примеры - практически синонимы.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #14 : Октябрь 09, 2009, 11:21 »

В этом виде мой и твои примеры - практически синонимы.

Да, почти синонимы. Я просто привел примеры как еще можно очистить список. Улыбающийся
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.293 секунд. Запросов: 22.