int main ()
{
int * b;
b = (int*) malloc (1);
*b=110000;
free (b);
return 0;
}
Почему повреждение кучи происходит в free (b);
?
ИМО, повреждение кучи уже происходит в *b=110000;
.
int main ()
{
int * b;
b = (int*) malloc (1);
*b=110000;
free (b);
return 0;
}
Почему повреждение кучи происходит в free (b);
?
ИМО, повреждение кучи уже происходит в *b=110000;
.
Аргумент malloc()
— это количество байтов, которое нужно выделить. Вам нужно использовать:
b = (int*) malloc(sizeof(int));
Вы выделили слишком маленький блок, а затем записали в него больше байтов, чем выделили, что приводит к перезаписи бухгалтерской информации рядом с блоком и повреждению кучи.
*b=110000;
не повреждается, поскольку использует больше места, чем доступно?
- person Alan; 13.10.2010
Это *b=110000; Потому что вы выделяете память для одного байта, а затем назначаете ей int, который больше одного байта. Либо у вас может быть b= (int *)malloc(sizeof(int)) или вместо int *b вы можете иметь char *b, а затем привести указатель malloc к char *. Код может даже работать, если вы присвоите значение меньше 128 (из-за знакового символа) для *b.
РЕДАКТИРОВАТЬ: - Я думаю, что иногда даже это будет работать без каких-либо хлопот. Потому что компилятор может выделить более одного байта памяти для быстрого доступа к данным.
Повреждение кучи действительно происходит уже при назначении *b=11000
, но оно не обнаруживается до вызова free(b)
, потому что это первая точка, в которой целостность кучи снова проверяется.
Проверка целостности кучи при каждом присваивании (или даже при каждом присваивании с использованием разыменованного указателя) слишком сильно замедлила бы работу большинства программ и слишком сильно привязала бы компилятор к реализации библиотеки. По этой причине проверки целостности выполняются только при манипулировании кучей, что находится в функциях malloc
и free
(и им подобных).
Код записывает в блок памяти больше данных, чем доступно для него, что искажает начало следующего действительного блока памяти.
Использование char * вместо int * и запись значения от -128 до 127 в *b должно исправить это.
Ваше значение 110000 --> 0x01ADB0 --> 3 bytes
. Вы записываете 3 байта данных в 1 байт, который вы запросили из кучи.
Важно знать, что malloc делает с параметром 1 и что вы помещаете в эту память.
malloc()
выделяет размер байтов и возвращает указатель на выделенную память. Также не забудьте проверить указатель перед его использованием и инициализацией локальных переменных.