Название: Выделение памяти под структуру Отправлено: Waryable от Сентябрь 24, 2009, 05:15 Код Имеем такую структуру чисто как пример для разбора. Раньше я как то не задумывался над этой проблемой, но тут понадобилось сделать надежный код и появился данный вопрос: как происходит работа с памятью для данной структуры во время исполнения? Ведь на сколько я знаю под структуру выделяется некоторый участок памяти, который сегментирован неким образом(выравнивание полей по умолчанию), но все равно является неким цельным участком. Если во время исполнения пихнуть в 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 Во даю!!! Надо в отпуск срочно. Использовал версию проекта с ручной очисткой целых два дня, честно полагая что это версия без ручной работы. Вот до чего доводит лень... и нехватка времени! ??? :)
А стоило сделать примерчик на пару десятков строчек: Код И понял я, что это такое утечка через QList. Эта зараза на корке E8400 за 10 сек почти 100 метров съела. Как говорится: одна голова хорошо, а другая подскажет где ты не прав ;) pastor`у отдельное спс. Название: Re: Выделение памяти под структуру Отправлено: pastor от Октябрь 08, 2009, 12:30 По поводу освобождения памяти:
Код
или: Код
Название: Re: Выделение памяти под структуру Отправлено: Waryable от Октябрь 09, 2009, 04:20 Хм. Ну я опять чуток ошибся. В закомментированном блоке должно было быть конечно же:
Код В этом виде мой и твои примеры - практически синонимы. Название: Re: Выделение памяти под структуру Отправлено: pastor от Октябрь 09, 2009, 11:21 В этом виде мой и твои примеры - практически синонимы. Да, почти синонимы. Я просто привел примеры как еще можно очистить список. :) |