Russian Qt Forum

Qt => Общие вопросы => Тема начата: Waryable от Сентябрь 24, 2009, 05:15



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


Название: Re: Выделение памяти под структуру
Отправлено: fuCtor от Сентябрь 24, 2009, 06:56
В память где находится lVarl будут помещены разные виртуальные таблицы и другая информация необходимая для работы класса, в том числе различные параметры. А вот элементы добавляемые в этот список будут уже укладываться куда угодно в памяти, где под них выделится новое место.


Название: Re: Выделение памяти под структуру
Отправлено: Alex Custov от Сентябрь 24, 2009, 14:53
они в куче создаются


Название: Re: Выделение памяти под структуру
Отправлено: MoPDoBoPoT от Сентябрь 24, 2009, 18:42
Память под элементы списка выделяется динамически (забирается из кучи). QList - это шаблонный класс, использующий односвязный список. Почитай про списки и иже с ними (чуток из википедии (http://ru.wikipedia.org/wiki/Связный_список))


Название: Re: Выделение памяти под структуру
Отправлено: Igors от Сентябрь 24, 2009, 19:06
QList - это шаблонный класс, использующий односвязный список. Почитай про списки и иже с ними (чуток из википедии (http://ru.wikipedia.org/wiki/Связный_список))
Поправьте меня если нужно, но QList не есть связный список (т.е. элемент QList не содержит никаких указателей на следующий или предыдущий элементы) и имеет мало общего с std::list. Как я понял, QList - это просто массив указателей на объекты который может расти с головы или с хвоста. Для малых данных хранятся сами данные вместо указателей. В букваре правильно написано что QList - самый популярный контейнер.


Название: Re: Выделение памяти под структуру
Отправлено: Waryable от Сентябрь 25, 2009, 05:09
Так. Получается, что в структуру компилятор пихает указатель на область памяти в куче?

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


Название: Re: Выделение памяти под структуру
Отправлено: Igors от Сентябрь 25, 2009, 11:13
умные книги про Макса Шлее и Жасмин Бланшет пишут, что ..
Есть еще более умная книга - исходники  :)

Структура/класс не может "расти" или "уменьшаться", ее размер фиксирован при компиляции и известен через sizeof. Расти может блок(и) памяти которым контейнеры управляют и хранят указатель на него (часто еще через несколько указателей)


Название: Re: Выделение памяти под структуру
Отправлено: Waryable от Сентябрь 27, 2009, 08:24
Всем спс за участие. Теперь я почти спокоен.  :)


Название: Re: Выделение памяти под структуру
Отправлено: ритт от Сентябрь 28, 2009, 18:48
озадачивает это "почти" :)

но с другой стороны, лучше уж, действительно, единожды пройтись скрупулёзно по интересующей проблеме и сделать практические выводы /* нежели огрести кучу АСЕ, когда проект уже будет запущен :Р */


Название: Re: Выделение памяти под структуру
Отправлено: Waryable от Октябрь 08, 2009, 04:31
озадачивает это "почти" :)

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


Название: Re: Выделение памяти под структуру
Отправлено: pastor от Октябрь 08, 2009, 10:28
Если контейнер объявлен как QList<int>, то да, он будет заботиться об очистке. А если как QList<int *> - то увы нет. Этим должен заниматься программист.


Название: Re: Выделение памяти под структуру
Отправлено: Waryable от Октябрь 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`у отдельное спс.


Название: Re: Выделение памяти под структуру
Отправлено: pastor от Октябрь 08, 2009, 12:30
По поводу освобождения памяти:

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

или:

 
Код
C++ (Qt)
qDeleteAll(list);
list.clear();


Название: Re: Выделение памяти под структуру
Отправлено: Waryable от Октябрь 09, 2009, 04:20
Хм. Ну я опять чуток ошибся. В закомментированном блоке должно было быть конечно же:
Код
C++ (Qt)
for ( int k = 0; k < lQue.count(); k++ )
        delete lQue.at(k);
В этом виде мой и твои примеры - практически синонимы.


Название: Re: Выделение памяти под структуру
Отправлено: pastor от Октябрь 09, 2009, 11:21
В этом виде мой и твои примеры - практически синонимы.

Да, почти синонимы. Я просто привел примеры как еще можно очистить список. :)