main(){
char *block1=(char *)malloc(100);
char *block2=(char *)malloc(110);
char *block3=(char *)malloc(120);
free(block2);
}
Динамически распределяемая память
Цитата:
При каждом обращении к памяти выделяется непрерывный блок, состоящий из одного или нескольких параграфов. В первом параграфе имеется заголовок блока. При освобождении памяти блок помечается как свободный. Таким образом, в процессе работы программы свободные и занятые блоки начинают чередоваться. В результате увеличивается фрагментация кучи, когда общей свободной памяти много, а непрерывного блока необходимой длины нет.
Выделяемый блок памяти имеет вид
2
2
14
16
…..
16
В заголовке находятся:
-длина блока в параграфах (2 байта),
-сегментный адрес предыдущего блока (2 байта),
-далее идут данные. Адрес начала данных и возвращается функциями ДРП.
Т.е. блок выделяемой памяти должен быть кратен параграфу?
Проверяю это на следующем коде
Код:
Результат в BC 6.0 ++
block1==008F:4B38
block2==008F:4BA0
block3==008F:4C14
block2-block1==104
block3-block2==116
Результат в BC 3.1 ++
block1==913B:0004
block2==9142:0004
block3==914A:0004
block2-block1==112 байт
block3-block2==128 байт
------------------------------------------------------
получается что в 3.1. выделяется кратно параграфу, а в 6.0 нет?
------------------------------------------------------
Жду Вашего профессионального мнения .
00000-0000F - первый параграф памяти
00010-0001F - второй параграф памяти
....
FFFF0-FFFFF - 65536-й параграф памяти
!но! Это справедливо только для доса, для винды параграф не имеет никакого значения, поэтому компиляторы для 3.1 билдера и 6.0 работают по разному.
Очень благодарен Вам за ответы