Вопрос
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; Потому что вы выделяете память для одного байта, а затем присваиваете INT в нее, которая составляет более одного байта. Либо вы можете иметь b = (int *) malloc (sizeof (int)), либо вместо int *b у вас может быть char *b, а затем бросить указатель с мазором на char *. Код может даже работать, если вы назначите значение, которое составляет менее 128 (из -за подписанного char) *b.
РЕДАКТИРОВАТЬ:- Я думаю, что иногда даже это будет работать без каких-либо хлопот. Потому что компилятор может выбрать выделение более одного байта памяти для быстрого доступа данных.
Коррупция кучи действительно случается уже в *b=11000
назначение, но оно не обнаруживается до free(b)
Позвоните, потому что это первый момент, когда целостность кучи снова проверяется.
Проверка целостности кучи при каждом задании (или даже каждом назначении, связанном с указателем, привязанными к остановке), будет замедлить большинство программ слишком сильно, и это будет слишком тесно связать компилятор с реализацией библиотеки. По этой причине проверки целостности выполняются только при манипулировании кучи, которая находится в malloc
и free
функции (и друзья).
Код записывает больше данных в блок памяти, чем пространство, доступное для него, следовательно, повреждая начало следующего достоверного блока памяти.
Использование char *, а не int * и написание значения -128 до 127 к * B должно это исправить.