частичное высвобождение памяти
От: gh  
Дата: 03.08.02 21:32
Оценка:
Здравствуйте, Люди!

есть некое динамическое выделение памяти для массива, к примеру:

int *a;
a=malloc(50*sizeof(int));

а в итоге используется только первых 20 элементов.

как можно высвободить оставшуюся память с 21 по 50?

Только сейчас пришло в голову
free(a+21); // так пойдёт или это не корректно ( нет сейчас возможности самому проверить)
Re: частичное высвобождение памяти
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 03.08.02 21:40
Оценка:
Здравствуйте gh, Вы писали:

gh>как можно высвободить оставшуюся память с 21 по 50?


a = (int*)realloc (a, 20 * sizeof(int)); //20 — новый размер блока.
Re: частичное высвобождение памяти
От: SergH Россия  
Дата: 03.08.02 21:44
Оценка:
Здравствуйте gh, Вы писали:

gh>Только сейчас пришло в голову

gh>free(a+21); // так пойдёт или это не корректно ( нет сейчас возможности самому проверить)

Не должно пройти.
Делай что должно, и будь что будет
Re[2]: частичное высвобождение памяти
От: gh  
Дата: 04.08.02 08:40
Оценка:
Здравствуйте DarkGray, Вы писали:

DG>Здравствуйте gh, Вы писали:


gh>>как можно высвободить оставшуюся память с 21 по 50?


DG>a = (int*)realloc (a, 20 * sizeof(int)); //20 — новый размер блока.


Это понятно.
Только при этом, на сколько я понимаю, происходит выделение памяти в другом месте и туда происходит копирование этих 20 элиментов, а та память высвобождается.
Но это помоему не очень оптимально, так как реально у меня массив гдето на 5000*16 байт и очень часто идёт выделени и перераспределение. Меня волнует вопрос об оптимальности.

Или тогда надо что то другое думать...
Re[3]: частичное высвобождение памяти
От: Andrij Украина  
Дата: 04.08.02 09:44
Оценка:
Здравствуйте gh, Вы писали:

gh>Здравствуйте DarkGray, Вы писали:


DG>>Здравствуйте gh, Вы писали:


gh>>>как можно высвободить оставшуюся память с 21 по 50?


DG>>a = (int*)realloc (a, 20 * sizeof(int)); //20 — новый размер блока.


gh>Это понятно.

gh>Только при этом, на сколько я понимаю, происходит выделение памяти в другом месте и туда происходит копирование этих 20 элиментов, а та память высвобождается.
gh>Но это помоему не очень оптимально, так как реально у меня массив гдето на 5000*16 байт и очень часто идёт выделени и перераспределение. Меня волнует вопрос об оптимальности.

gh>Или тогда надо что то другое думать...


Можно написать свой класс и память выделять кусками — потом ненужные висвободить
Можно использовать системние функции Windows управления виртуальной памятю (VirtualAlloc ...)
— каждий из вариантов имеет свои +/- — выбирай
make it simple as possible, but not simpler
Re[3]: частичное высвобождение памяти
От: SergH Россия  
Дата: 04.08.02 10:09
Оценка:
Здравствуйте gh, Вы писали:

gh>Это понятно.

gh>Только при этом, на сколько я понимаю, происходит выделение памяти в другом месте и туда происходит копирование этих 20 элиментов, а та память высвобождается.
gh>Но это помоему не очень оптимально, так как реально у меня массив гдето на 5000*16 байт и очень часто идёт выделени и перераспределение. Меня волнует вопрос об оптимальности.

gh>Или тогда надо что то другое думать...


Вообще-то не знаю. Но если сделано по уму, то по возможности realloc должна избегать копирования и выделения памяти. А случай, когда буфер уменьшается — стопроцентная возможность. Достаточно просто поменять длину выделенного блока и пометить остаток как свободный.

По-моему у Рихтера напсано, что виндовская HeapReAlloc работает именно так, но в MSDN я этого что-то не заметил.
Делай что должно, и будь что будет
Re[3]: частичное высвобождение памяти
От: Andrew S Россия http://alchemy-lab.com
Дата: 04.08.02 10:14
Оценка:
Здравствуйте gh, Вы писали:

На самом деле — при realloc _может_ произойти выделение памяти в другом месте. А может и нет — все зависит от начального и конечного размеров блока, и реализации realloc в конктретном std.

Попробуй vector (resize) — они там сами алгоритм выделения памяти предоставляют. Можно и свой определить.


gh>>>как можно высвободить оставшуюся память с 21 по 50?


DG>>a = (int*)realloc (a, 20 * sizeof(int)); //20 — новый размер блока.


gh>Это понятно.

gh>Только при этом, на сколько я понимаю, происходит выделение памяти в другом месте и туда происходит копирование этих 20 элиментов, а та память высвобождается.
gh>Но это помоему не очень оптимально, так как реально у меня массив гдето на 5000*16 байт и очень часто идёт выделени и перераспределение. Меня волнует вопрос об оптимальности.

gh>Или тогда надо что то другое думать...
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re: частичное высвобождение памяти
От: CooLer Россия http://bestsoft.far.ru
Дата: 04.08.02 21:51
Оценка:
Здравствуйте gh, Вы писали:

gh>Здравствуйте, Люди!


gh>есть некое динамическое выделение памяти для массива, к примеру:


gh>int *a;

gh>a=malloc(50*sizeof(int));

gh>а в итоге используется только первых 20 элементов.


gh>как можно высвободить оставшуюся память с 21 по 50?


Вот только непонятно — а зачем ее высвобождать? Если ты ее совсем не используешь — зачем столько выделил? А если будешь использовать в будущем ИМХО затраты на перераспределение памяти не окупятся.

gh>Только сейчас пришло в голову

gh>free(a+21); // так пойдёт или это не корректно ( нет сейчас возможности самому проверить)

Это, конечно, не корректно
"Выше голову" — сказл палач, надевая петлю
Re: частичное высвобождение памяти
От: Kuz  
Дата: 05.08.02 03:02
Оценка:
a=realloc(a,20*sizeof(int));
Re[3]: частичное высвобождение памяти
От: Vladik Россия  
Дата: 05.08.02 06:07
Оценка:
Здравствуйте gh, Вы писали:

gh>Но это помоему не очень оптимально, так как реально у меня массив гдето на 5000*16 байт и очень часто идёт выделени и перераспределение. Меня волнует вопрос об оптимальности.


Если очень часто идет перераспределение, то имеет смысл задуматься над более другой логикой распредения памяти — не в массиве. Опиши конкретнее, что у тебя за задача?
Как все запущенно...
Re[2]: частичное высвобождение памяти
От: Аноним  
Дата: 05.08.02 07:18
Оценка:
Здравствуйте SergH, Вы писали:

SH>Здравствуйте gh, Вы писали:


gh>>Только сейчас пришло в голову

gh>>free(a+21); // так пойдёт или это не корректно ( нет сейчас возможности самому проверить)

SH>Не должно пройти.


Там же насколько я понимаю перед указателем на область памяти всегда стоит размер памяти выделленой malloc и при вызове free указаный объем паямяти и высвобождаеться так что дествительно free(a+21) не корректна
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.